【问题标题】:Get available rooms in selected dates django在选定的日期获取可用房间 django
【发布时间】:2021-07-07 17:39:43
【问题描述】:

我正在创建一个类似于房屋预订系统的项目,有一些特殊性(您发布房屋但您可以单独租用房间,并且您可以设置假期何时房屋不可用)在Django中(rest-framework,所以现在只有 API)。房屋模型可以简化为:

class House(models.Model):
    title = models.CharField(max_length=127)
    n_rooms = models.PositiveSmallIntegerField()

当房子不可用时,有一个日历可以保存:

class Unavailability(models.Model):
    house = models.ForeignKey(House, on_delete=models.CASCADE, related_name="house_unavailability")
    unavailable_rooms = models.SmallIntegerField()
    from_date = models.DateField()
    to_date = models.DateField()

还有一个在预订时保存的模型:

class Booking(models.Model):
    house = models.ForeignKey(House, on_delete=models.CASCADE, related_name='booking')
    booker = models.ForeignKey(UserProfile, on_delete=models.CASCADE)
    start_date = models.DateField()
    end_date = models.DateField()
    n_rooms = models.PositiveSmallIntegerField(default=1)
    rent = models.DecimalField(decimal_places=2, max_digits=8)

我现在正在尝试创建一个 API 来搜索在所选日期至少有一个房间可用的房屋(不是在节假日也没有预订)。 我见过一些similar cases 没有我所拥有的特殊性并使用其他语言,但没有使用 Django(我使用的是 MySQL,因此如果没有出现使用 Django 的干净解决方案,我可以回退到 SQL)

【问题讨论】:

  • 您当前的设置有什么问题?
  • @Strawberry 并不是说​​有什么问题,只是我不知道该怎么做,而且我在网上也找不到任何信息

标签: mysql django django-rest-framework


【解决方案1】:

在这里,我正在尝试编写一个可以提供预期结果的查询,但我没有对该查询进行测试,因此可能会出现语法错误,但我认为它会有所帮助。

from django.db.models import Sum, Value, IntegerField, Q, F
from django.db.models.functions import Coalesce
from django.utils import timezone

given_start_date = timezone.now().date() # assuming
given_end_date = timezone.now().date() # assuming

houses_at_least_one_room_available = House.objects.annotate(
    total_unavailable_rooms=Coalesce(
        Sum("house_unavailability__unavailable_rooms", filter=Q(
            house_unavailability__from_date__range=(given_start_date, given_end_date),
            house_unavailability__to_date__range=(given_start_date, given_end_date)
        ), distinct=True),
        Value(0),
        output_field=IntegerField()
    ),
    total_booked_rooms=Coalesce(
        Sum("booking__n_rooms", filter=Q(
            booking__start_date__range=(given_start_date, given_end_date),
            booking__end_date__range=(given_start_date, given_end_date)
        ), distinct=True),
        Value(0),
        output_field=IntegerField()
    ),
    available_rooms=F("n_rooms") - F("total_unavailable_rooms") - F("total_booked_rooms")
).filter(available_rooms__gt=0)

在这里,您可以根据您的用例更新Sum 中的filter 查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    相关资源
    最近更新 更多