Джанго сложные запросы - PullRequest
       11

Джанго сложные запросы

1 голос
/ 13 января 2011

Мне нужно создать фильтр для объекта, который проверяет диапазоны дат. Сейчас я выполняю очень неэффективный цикл, который проверяет все объекты. Я хотел бы упростить это до вызова базы данных.

Логика в том, что у вас есть start и end объекты даты. Мне нужно проверить, находится ли начало или конец в пределах диапазона назначения.

if (start >= appointment.start && start < appointment.end) || 
   (end > appointment.start && end <= appointment.end)

Я мог бы сделать это в SQL, но я не так хорошо знаком со структурой модели Django для более сложных запросов.

1 Ответ

4 голосов
/ 13 января 2011

Вам нужны объекты Q для операторов & и ИЛИ и тип поиска поля range

Q Объект: http://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects

диапазон: http://docs.djangoproject.com/en/dev/ref/models/querysets/#range

Entry.objects.filter(Q(start__range=(appointment.start, appointment.end)) | 
    Q(end__range=(appointment.start, appointment.end)))

Если SQL BETWEEN - это не то, что вы ищете, вы всегда можете использовать конкретные комбинации объектов Q для точного воспроизведения ваших условий:

Entry.objects.filter((Q(start__gte=appointment.start) & Q(start__lt=appointment.end)) | 
   (Q(end__gt=appointment.start) & Q(end__lte=appointment.end)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...