Как фильтровать модели, связанные с внешним ключом, используя диапазон времени даты

Я пытаюсь создать систему бронирования и хочу запросить все доступные таблицы. Итак, я сделал следующее,

...
date_time = request.data.get('date_time')
date_time = datetime.strptime(date_time, '%b %d %Y %I:%M%p')
num_of_attendees = request.data.get('num_of_attendees')

tables = Table.objects.filter(~Q(
    tablereservation__date_time__range=[date_time, date_time + timedelta(hours=2)]), 
    num_of_chairs__gte=num_of_attendees
)
...

Но он возвращает все объекты таблицы.

Мои модели,

class Table(models.Model):
    """ Holds table details """

    num_of_chairs = models.PositiveSmallIntegerField(default=1)

    def __str__(self):
        return str(self.id)


class TableReservation(models.Model):
    """ Holds table reservation details """

    date_time = models.DateTimeField()
    table = models.ForeignKey(Table, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return '{}-{}'.format(self.table, self.user)

Но я хочу получить только те объекты таблицы, которые не зарезервированы в заданном диапазоне дат. Любая помощь будет высоко оценена.

~Q - это отрицание выражения Q. То есть ~Q - это NOT Q

Вы уверены, что хотите ~Q?

Кроме того, проблема, вероятно, связана с тем, как __range взаимодействует с DateTimeField. См. документацию здесь: Range (Я только вчера столкнулся с этой проблемой, проблема приведет к тому, что ваш запрос всегда будет пустым в последний день диапазона, который ваш запрос всегда для последнего дня диапазона!)

Вы можете попробовать:

start_time = date_time

end_time = date_time + timedelta(hours=2)

tables = Table.objects.filter(
    tablereservation__date_time__gte=start_time, tablereservation__date_time__lte=end_time).filter(num_of_chairs__gte=num_of_attendees)
Вернуться на верх