我正在构建一个django查询来进行公寓预订。用户输入开始日期和结束日期,并检查数据库是否已存在冲突预留。也就是说,如果预订的日期范围的任何部分与现有预约的日期范围重叠。
我有一个可以工作的系统,但它会在数据库中击中3次,我确信它可以在1中完成(在查询中使用OR条件?)。我可以优化以下内容吗?:
bookings = Booking.objects.filter( arrival_date__range=(query_start, query_end) )
if len(bookings) > 0:
status = 'failure'
else:
bookings = Booking.objects.filter( departure_date__range=(query_start, query_end) )
if len(bookings) > 0:
status = 'failure'
else:
bookings = Booking.objects.filter( arrival_date__lte=query_start ).filter( departure_date__gte = query_end )
if len(bookings) > 0:
status = 'failure'
非常感谢您的反馈
答案 0 :(得分:1)
这可以通过使用查询集和使用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
这应该只对db打一次。