我的代码片段:
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”来完成,但我在这里迷路了。有人可以指导我吗?