Фильтровать запрос внутри запроса в Django представлениях - PullRequest
0 голосов
/ 14 января 2020

Я работаю над приложением бронирования отелей, в котором у меня есть модель для "RoomType", которая содержит поле для количества доступных номеров в день ...

Я создал новую модель для сохранения BookedDates ( from, to), с ForiegnKey для модели RoomType ...

Каждый раз, когда пользователь бронирует комнату (от, до), будет послан сигнал модели RoomType для сохранения в нем в ManyToManyField .. .

Теперь конечные пользователи будут искать доступные комнаты с указанием c даты (от, до)

Поэтому я создал запрос для фильтрации комнат, доступных в этом даты и проверить, зарезервировано ли оно в указанной дате c больше раз, чем числоOfAvailableRoom в день.

Моя проблема в том, что когда я делаю запрос для фильтрации RoomTypes i. exclude () через него Модели Query For BookedDates, в которых поле numberOfAvailableRoom на день меньше числа времени, указанного c номер забронирован на эту дату ... но фактически результат этого исключает любой номер RoomType, который регистрируется в моделях BookedDates!

models.py

class BookedDates(models.Model):
    hotel = models.ForeignKey(Hotel, on_delete=models.CASCADE, null=True)
    room_type = models.ForeignKey(
        'RoomType', on_delete=models.CASCADE, null=True)
    booked_from = models.DateField(null=True)
    booked_to = models.DateField(null=True)

    def __str__(self):
        return '{} /\ {} /\ {}'.format(self.room_type, self.hotel, self.booked_from)


class RoomType(models.Model):
    hotel = models.ForeignKey(Hotel, on_delete=models.CASCADE)
    room_type = models.ForeignKey(RoomTypesNames, on_delete=models.CASCADE)
    bookedDates = models.ManyToManyField(
        BookedDates)
    number_of_rooms = models.PositiveIntegerField()

views.py

            roomsByDate = RoomType.objects.annotate(modulo=numAdult % F('room_capacity')).filter(
                q_city, q_room_capacity1, modulo=0
            ).exclude(number_of_rooms__lte = BookedDates.objects.filter(room_type=F('room_type'), 
              booked_from__in = day).count())  ## my error is that the exclude , excludes any room type in the BookedDates model, even if it is reserved in this date number of times less than number_of_rooms available per day

Любой другой подход для создания этого запроса правильным способом Будет приветствоваться Заранее спасибо

Ответы [ 2 ]

1 голос
/ 14 января 2020

Полагаю, вам нужна еще одна аннотация, чтобы рассчитать количество бронирований для этой комнаты. Вы можете использовать обратный путь внешнего ключа / related_name, который в данном случае равен roomtype_set Я думаю.

roomsByDate = RoomType.objects.annotate(
    modulo=numAdult % F('room_capacity')
).filter(
    q_city, q_room_capacity1, modulo=0
).annotate(
    times_booked=Count("roomtype_set__id", filter=Q(booked_from__in=day), distinct=True)
).exclude(
    number_of_rooms__lte=F('times_booked')
)
0 голосов
/ 15 января 2020

Спасибо за @schillingt

обновление его ответа. На самом деле, когда я ищу по названию related_name для модели, запрос фильтрует время его существования в других BookedDates модель независимо от запроса date_from в этой модели ... Итак, я сделал запрос через сам ManyToManyField, чтобы подсчитывать время только этого поля bookedDates

roomsByDate = RoomType.objects.annotate(
    modulo=numAdult % F('room_capacity')
).filter(
    q_city, q_room_capacity1, modulo=0
).annotate(
    times_booked=Count("bookedDates ", filter=Q(booked_from__in=day), distinct=True)
).exclude(
    number_of_rooms__lte=F('times_booked')
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...