Как фильтровать модели, связанные с внешним ключом, используя диапазон времени даты
Я пытаюсь создать систему бронирования и хочу запросить все доступные таблицы. Итак, я сделал следующее,
...
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)