1

我正在研究预订系统,但找不到选择免费日期的好方法。这是我的模型:

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 一次(应为零“不可用”)

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

4

2 回答 2

1

你想要预订,而不是出租单位,所以过滤它们:

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)
)
于 2013-05-26T07:30:34.323 回答
0

Ok it seems that it is not possible to do what I wanted. So I choose a different approach:

Make a list of all rental_units: all_units

Make a list of rental_units from the query below, and remove these list items from 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)) 

I enhanced the queryset, so it differs from the topic start.

The queryset returns all Bungalows that have a reservation between the arrival and departure date.

于 2013-05-26T11:41:17.573 回答