Django中ForeignKey类型字段filter反向查询实现问题求助
问题原因
你之前的查询失效核心原因是:RoomBookings的HotelName字段从存储字符串的CharField改为关联Hotel模型的外键后,字段存储内容从酒店名称字符串变为Hotel表的主键ID,原有直接匹配字符串的查询逻辑不再适用。你之前尝试的失败写法主要存在两个问题:
- 部分查询条件的后缀运算符少写了一个下划线,比如
_exact应为__exact - 额外多加了不存在的
__Hotel中间层级,HotelName外键直接关联Hotel模型,不需要额外加__Hotel跳转
正确查询写法
最优写法(已拿到完整hotel实例时)
直接用外键关联的实例做匹配,不需要跨表查字符串,性能更高且不易出错:
# 单条件查询 queryset2 = RoomBookings.objects.filter(HotelName=hotel) # 对应你之前的全条件查询 RoomBookings.objects.filter( HotelName=hotel, RoomType__icontains=hotel.RoomType, ArrivalDate__lt=RoomBookingsForm['DepartureDate'], DepartureDate__gt=RoomBookingsForm['ArrivalDate'] )
模糊匹配写法(只有酒店名称字符串时)
如果需要根据酒店名称做模糊查询,正确的跨表语法为外键字段名__关联模型字段名:
queryset2 = RoomBookings.objects.filter(HotelName__HotelName__icontains=hotel.HotelName)
额外优化建议
建议把RoomBookings里的外键字段HotelName重命名为hotel,避免和Hotel模型里的HotelName字段混淆,降低后续维护的出错概率。
内容的提问来源于stack exchange,提问作者Ross Symonds
相关产品推荐
相关产品推荐

