django queryset для системы бронирования - PullRequest
0 голосов
/ 22 января 2012

Я строю запрос django, чтобы забронировать квартиру.Пользователь вводит дату начала и окончания, и проверяется БД, чтобы увидеть, существует ли уже конфликтующее резервирование.То есть, если какая-либо часть диапазона дат резервирования перекрывается с диапазоном дат существующего резервирования.

У меня есть система, которая работает, но она обращается к БД 3 раза, и я уверен, что это может бытьсделано в 1 (с условием ИЛИ в запросе?).Могу ли я оптимизировать следующее?

1004

Большое спасибо за отзыв

1 Ответ

1 голос
/ 26 апреля 2012

Это возможно путем ORing наборов запросов и использования объекта Q с чем-то вроде этого:

from django.db.models import Q

apts_booked1 = Rental.objects.values_list('id', flat=True).select_related().filter(  Q(booking__arrival_date__range=(query_start, query_end) )  | Q(booking__departure_date__range=(query_start, query_end) )).distinct('id')
apts_booked2 = Rental.objects.values_list('id', flat=True).select_related().filter(booking__arrival_date__lte=query_start).filter( booking__departure_date__gte = query_end ).distinct('id')
apts_booked = apts_booked1 | apts_booked2

Это должно попасть в БД только один раз.

...