用于预订系统的django queryset

时间:2012-01-22 10:58:52

标签: django django-views django-queryset

我正在构建一个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 个答案:

答案 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打一次。