我正在预订系统,我找不到选择免费日期的好方法。这是我的模特:
class rental_group(models.Model):
group_title = models.CharField(max_length = 30)
description = models.TextField()
class rental_units(models.Model):
group = models.ForeignKey(rental_group)
number = models.CharField(max_length = 6)
class Reservations(models.Model):
#name = models.ForeignKey(customer)
rental_unit = models.ForeignKey(rental_units)
start_date = models.DateField()
end_date = models.DateField()
我尝试使用此查询选择可用房间:
rental_units.objects.filter(group__rental_group = 'Bungalow').exclude(Q(Reservations__start_date__lt = arrival)&Q(Reservations__end_date__gt = arrival)|Q(Reservations__start_date__lt = departure)&Q(Reservations__end_date__gt = departure))
只有一次预订时,此功能非常完美。如果对同一号码有更多预订,则出现问题。例如,当我在数字120上有两个保留时,当一切都可用时,该查询返回120两次。如果新预订在一个旧的保留日期之间(应该为零“不可用”),则120返回一次
这可以通过查询实现吗?或者我应该对预订做些什么,并从列表中删除已保留的房屋(当有很多预订时可能需要很长时间)
答案 0 :(得分:1)
你想要预订,而不是rental_units,所以过滤它们:
Reservations.objects\
.filter(rental_unit__group__group_title='Bungalow')\
.exclude(
Q(start_date__lt=arrival) & \
Q(end_date__gt=arrival) | \
Q(start_date__lt=departure) & \
Q(end_date__gt=departure)
)
答案 1 :(得分:0)
好吧,似乎不可能做我想要的事情。所以我选择了一种不同的方法:
列出所有rental_units:all_units
从下面的查询中列出rental_units,并从all_units中删除这些列表项:
rental_units.objects.filter(group__rental_group = 'Bungalow').filter(Q(Reservations__start_date__gt = arrival)&Q(Reservations__start_date__lt = departure)|Q(Reservations__end_date__gt = arrival)&Q(Reservations__end_date__lt = departure))
我增强了查询集,因此它与主题start不同。
查询集返回所有在到达和离开日期之间有预订的平房。