0

更新

感谢 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)
4

1 回答 1

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 文档。

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

于 2021-10-22T22:29:06.100 回答