2012-01-22 50 views
0

我正在建立一个django查询,使公寓预订。用户输入开始日期和结束日期,同时检查数据库,看看是否存在冲突预留。也就是说,如果预订日期范围的任何部分与现有预订的日期范围重叠。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' 

非常感谢

回答

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 

这应该只命中该分贝一次。