0

我的代码片段:

boards_qs = BoardRate.objects.filter(
        Q(room_status="OP") &
        Q(hotel_log__date__range=[check_in_date, check_out_date]) &
        Q(hotel_log__hotel__pk__in=hotel_id_list) &
        Q(hotel_log__room_to_sell__gte=F("hotel_log__room_sold") + requested_similar_room_type_amount)
    )

在上面的代码片段中,我希望以下行能够以这样一种方式工作,即如果缺少某个日期,那么它不应该返回其他日期。在 range/in 运算符中实际发生的是,如果它找到一个或多个匹配数据,它会在查询集中返回这些数据。但这不是我需要的。我需要确保如果所有日期都匹配,则只返回查询集,否则它应该为空。

Q(hotel_log__date__range=[check_in_date, check_out_date])

如果 in 运算符的解决方案可行,我们也可以使用“in”运算符。在这种情况下,代码片段将是:

Q(hotel_log__date__range=date_list)

为了更好地理解,我还添加了模型


class BoardRate(models.Model):
   STATUS_CHOICES = [("OP", "open"), ("CL", "close")]
   RATE_CHOICES = [("NOR", "refundable"), ("NRF", "non-refundable")]
   id = models.BigAutoField(primary_key=True)
   hotel_log = models.ForeignKey(
       "hotel_dashboard.HotelLogBook", on_delete=models.CASCADE, blank=True, null=True)
   room_status = models.CharField(
       max_length=25, choices=STATUS_CHOICES, default="OP")
   room_rate = models.DecimalField(default=0, max_digits=10, decimal_places=2)
   board_type = models.ForeignKey(
       UnifiedHotelBoardType, on_delete=models.CASCADE, related_name='hotel_log')
   rate_class = models.CharField(
       max_length=3, blank=True, choices=RATE_CHOICES, default="NRF")


class HotelLogBook(models.Model):
   log_id = models.BigAutoField(primary_key=True)
   hotel = models.ForeignKey(
       UnifiedHotel, on_delete=models.CASCADE, related_name='hotel_log')
   room = models.ForeignKey(
       UnifiedHotelRoomDetailsPerHotelPerRoom, on_delete=models.CASCADE, related_name='room_log')
   date = models.DateField(null=True, blank=True)
   room_to_sell = models.PositiveIntegerField(default=0)
   room_sold = models.PositiveIntegerField(default=0)
   board_rate = models.ManyToManyField(
       BoardRate, related_name="hotel_log_boards", blank=True)

例子:

假设在表中我们有 13、14、15、16、17 April,在过滤器中,我们正在搜索 13 到 19 April。现在,如果我们使用“in”运算符,我们将获得 4 月 13 日至 17 日的数据,但我不希望这样。如果 4 月 13 日至 19 日的任何一天数据不可用,那么我想要一个空的查询集。

预言:

我相信这可以使用“when”和“then”或“case”来完成,但我在这里迷路了。有人可以指导我吗?

4

1 回答 1

0

您可以计算相关日期的数量并过滤计数等于您期望的日期数量

Model.objects.filter(
    model_two__date__range=[start_date, end_date]
).annotate(
    num_days=Count('model_two__date', distinct=True)
).filter(
    num_days=(end_date - start_date).days + 1
)
于 2020-04-05T09:50:35.700 回答