Django按日期和状态筛选



我的第一个问题是,我一直在四处寻找,但找不到解决方案。

我正在建立一个预订系统,我的型号是

class Room(models.Model):
number = models.IntegerField()
beds = models.IntegerField()
capacity = models.IntegerField()
category = models.ForeignKey(
RoomCategory, on_delete=models.CASCADE, blank=True, null=True)
class Booking(models.Model):
room = models.ForeignKey(Room, on_delete=models.CASCADE, blank=True, null=True)
check_in = models.DateField()
check_out = models.DateField()
status = models.IntegerField(blank=True, null=True)
if request.method == 'POST':
no_disponible = "No hay habitaciones disponibles, selecciona otras fechas"
if form.is_valid():
room_list = Room.objects.filter(category=1).exclude(booking__check_in__lt=form.cleaned_data['check_out'],
booking__check_out__gt=form.cleaned_data['check_in'], booking__status__gt=0)

当客户确认时,我正在更改状态,所以当状态不是1时,我想检查日期是否可用(一旦付款获得批准,我会将状态更改为1。但是booking_status_gt=0在这里似乎不起作用

根据您的查询,您希望排除具有以下的房间

  1. 入住次数少于要求退房次数的预订
  2. 退房时间大于要求入住时间的预订
  3. 状态大于0的预订

您当前的查询是:

Room.objects.filter(category=1).exclude(
booking__check_in__lt=form.cleaned_data['check_out'],
booking__check_out__gt=form.cleaned_data['check_in'], 
booking__status__gt=0,
)

这将删除状态大于0的所有房间,以及签入/签出日期无效的房间,即使其中一些签入/退房日期无效的客房的状态为0。这是因为exclude在跨越这样的多值关系时是如何工作的。

要解决此问题,请更改查询,使用Booking获取包含所需排除项的所有预订,然后将其与反向关系进行比较:

Room.objects.filter(category=1).exclude(
booking__in=Booking.objects.filter(
check_in__lt=form.cleaned_data['check_out'],
check_out__gt=form.cleaned_data['check_in'],
status__gt=0,
)
)

请阅读此处,以进一步了解exclude在这种情况下的行为。

最新更新