【问题标题】:Django filter field with foreign key带有外键的 Django 过滤字段
【发布时间】:2021-12-09 06:41:21
【问题描述】:

更新

感谢 Root 的以下回答(我赞成)。根据您的建议,我能够解决我的问题。我现在正在使用这个 -

 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)

【问题讨论】:

    标签: python django lookup django-filter reverse-lookup


    【解决方案1】:

    我已经测试了您的代码。您的第一次尝试完全没问题。

    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)。检查关键字related_name。

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

    4. 仔细阅读 Django 文档。

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

    【讨论】:

      猜你喜欢
      • 2014-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-28
      • 2018-12-13
      • 2023-03-16
      • 2011-03-14
      • 2014-09-29
      相关资源
      最近更新 更多