带有外键的Django筛选器字段

2024-09-26 20:36:07 发布

您现在位置:Python中文网/ 问答频道 /正文

更新

谢谢你下面的回答(我投了赞成票)。根据你的建议,我解决了我的问题。我现在用这个-

 try:
    queryset2 = RoomBookings.objects.filter(HotelName__HotelName__icontains=hotel.HotelName)
 except:
     pass

这是有效的-

    RoomBookings.objects.filter(HotelName__icontains=hotel.HotelName, RoomType__icontains= hotel.RoomType, 
        ArrivalDate__lt=RoomBookingsForm['DepartureDate'], DepartureDate__gt=RoomBookingsForm['ArrivalDate'])

但后来我将RoomBookings模型中的HotelName字段从CharField更改为ForiegnKey。现在我不知道如何进行反向查找。这些是我失败的尝试-

        # queryset2 = RoomBookings.objects.filter(HotelName__HotelName__icontains=hotel.HotelName)
        # queryset2 = RoomBookings.objects.filter(HotelName__Hotel__HotelName__icontains=hotel.HotelName)
       
        # queryset2 = RoomBookings.objects.filter(HotelName__Hotel__HotelName_exact=hotel.HotelName)
        # queryset2 = RoomBookings.objects.filter(HotelName__HotelName_exact=hotel.HotelName)
        



class Hotel(models.Model):
    HotelName               = models.CharField(max_length=60, null=False)
          

    def __str__(self):
        return self.HotelName



class RoomType(models.Model):
    HotelName           = models.ForeignKey(Hotel, null=True, blank=True, on_delete=models.CASCADE)
    RoomType            = models.CharField(max_length=60, null=False, choices=Room_Type)
    

    def __str__(self):
return '{0}, {1}'.format(str(self.HotelName), self.RoomType) 





class RoomBookings(models.Model):
    User               = models.ForeignKey(User, null=True, blank=True, on_delete=models.CASCADE)
  
    HotelName           = models.ForeignKey(Hotel, null=True, blank=True, on_delete=models.CASCADE)
 
    RoomType            = models.CharField(max_length=60, null=False, choices=Room_Type)
     
    def __str__(self):
     
        return '{0}, {1}, {2}'.format(self.HotelName, self.ArrivalDate, self.RoomType)

Tags: selftrueobjectsmodelsfilternullhotelcharfield
1条回答
网友
1楼 · 发布于 2024-09-26 20:36:07

我已经测试了你的代码。你的第一次尝试很好

queryset2 = RoomBookings.objects.filter(HotelName__HotelName__icontains=hotel.HotelName)

但我不确定hotel.HotelName下会发生什么?你试过像print(f"hotel.HotelName: {hotel.HotelName}")那样检查它吗?可能是没有,你无法找到你的结果

不过,我对你没有什么建议

  1. 保持代码整洁

  2. 定义一些反向关系名称,例如HotelName = models.ForeignKey(Hotel, related_name="hotel", null=True, blank=True, on_delete=models.CASCADE)。检查与关键字相关的名称

  3. 尝试将模型字段命名为与外键模型字段不完全相同的名称。比如说hotel = models.ForeignKey(Hotel, related_name="hotel", null=True, blank=True, on_delete=models.CASCADE)

  4. 仔细阅读Django文档

谢谢。希望这是你问题的答案

相关问题 更多 >

    热门问题