Django 预订系统中的免费日期

Django 预订系统中的免费日期,django,Django,我正在使用预订系统,我找不到一个选择自由日期的好方法。这是我的模型: 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 =

我正在使用预订系统,我找不到一个选择自由日期的好方法。这是我的模型:

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


这可以通过查询实现吗?或者我应该重新考虑预订,并从列表中删除预订的房子(如果有很多预订,这可能需要很多时间)

您想要的是预订,而不是租赁单元,所以请过滤它们:

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)
)

您想要的是预订,而不是租赁单元,因此请过滤它们:

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)
)

好吧,看来不可能做我想做的事。因此,我选择了一种不同的方法:

列出所有租赁单元:所有单元

从下面的查询中列出租赁单元,并从所有单元中删除这些列表项:

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)) 
我增强了queryset,因此它与主题开头不同


查询集返回在到达日期和离开日期之间有预订的所有平房。

好的,似乎不可能实现我想要的。因此,我选择了一种不同的方法:

列出所有租赁单元:所有单元

从下面的查询中列出租赁单元,并从所有单元中删除这些列表项:

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)) 
我增强了queryset,因此它与主题开头不同


查询集返回在到达日期和离开日期之间有预订的所有平房。

谢谢您的回复!这给了我一张预定单,但我想要一张可用房屋的清单。哦,我知道了。因此,只需将
.distinct()
添加到查询中(例如,在末尾)。它将删除重复项,比如说120号房子,我有一个从5月1日到5月5日的预订,还有一个从6月1日到6月6日的预订。如果输入5月4日到达日期和5月7日离开日期,查询将返回一个结果。我现在走错了路,因为当其中一个预订匹配时,查询应该是空的(不可用)。我不知道.distinct()在这里有什么帮助……a+1表示distinct()表示感谢!这给了我一张预定单,但我想要一张可用房屋的清单。哦,我知道了。因此,只需将
.distinct()
添加到查询中(例如,在末尾)。它将删除重复项,比如说120号房子,我有一个从5月1日到5月5日的预订,还有一个从6月1日到6月6日的预订。如果输入5月4日到达日期和5月7日离开日期,查询将返回一个结果。我现在走错了路,因为当其中一个预订匹配时,查询应该是空的(不可用)。我不确定.distinct()在这里有什么帮助……a+1表示distinct()提示