#python #django #lookup #django-filter #reverse-lookup
Вопрос:
Обновить
Спасибо вам за ваш ответ ниже (который я поддержал). Основываясь на ваших предложениях, я смог решить свою проблему. Сейчас я использую это —
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'])
Но затем я изменил поле Имени отеля в модели бронирования номеров с 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)
Ответ №1:
Я проверил ваш код. Ваша первая попытка в полном порядке.
queryset2 = RoomBookings.objects.filter(HotelName__HotelName__icontains=hotel.HotelName)
Но я не совсем понимаю, что происходит hotel.HotelName
? Вы пробовали это проверить, как print(f"hotel.HotelName: {hotel.HotelName}")
? Может быть, это не так, и вы не можете найти свои результаты.
Однако у меня есть несколько предложений для вас.
- Держите свой код в чистоте.
- Определите некоторые имена обратных отношений, например.
HotelName = models.ForeignKey(Hotel, related_name="hotel", null=True, blank=True, on_delete=models.CASCADE)
. проверьте ключевое слово related_name. - попробуйте назвать поля вашей модели не совсем так, как поле модели внешнего ключа. например.
hotel = models.ForeignKey(Hotel, related_name="hotel", null=True, blank=True, on_delete=models.CASCADE)
- Внимательно прочитайте документацию по Django.
Спасибо. Надеюсь, это ответ на ваш вопрос.