Поле фильтра Django с внешним ключом

#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}") ? Может быть, это не так, и вы не можете найти свои результаты.

Однако у меня есть несколько предложений для вас.

  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.

Спасибо. Надеюсь, это ответ на ваш вопрос.