带有外键的Django筛选器字段



更新

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新