【问题标题】:Filtering down through multiple ForeignKey relations in django通过 django 中的多个 ForeignKey 关系进行过滤
【发布时间】:2021-05-26 15:04:22
【问题描述】:

我试图通过多个外键关系来解决每个酒店有很多房间,每个房间有很多房价计划,每个房价计划有很多价格。

如果你仔细想想,它就像圣诞树:

酒店
v
房间
v
费率计划
v
价格

我如何执行查询,以返回特定 price_date、特定 price_price 和特定 price_availability 中特定 hotel_city 的酒店? (就像 Expedia 或 booking.com 查询)

例如:

Hotel.objects.filter(city='Beirut').filter(room__name=Room.objects.filter(rateplan__name=Rateplan.objects.filter(prices__availability=Prices.objects.filter(availability=1))))

我查看了 django 复杂查询文档并注释/聚合,但无法理解它。

下面是我的模型:

class Hotel(models.Model):
    name = models.CharField(max_length=64)
    city = models.CharField(max_length=64, default='Warsaw')

class Room(models.Model):
    hotel_id = models.ForeignKey(Hotel, on_delete=models.CASCADE, related_name='room')
    name = models.CharField(max_length=64, default='Double')

class Rateplan(models.Model):
    room_id = models.ForeignKey(Room, on_delete=models.CASCADE, related_name='rateplan')
    name = models.CharField(max_length=64, default='Standard')

class Prices(models.Model):
    rateplan_id = models.ForeignKey(Rateplan, on_delete=models.CASCADE, related_name='prices')
    date = models.DateField()
    price_1 = models.DecimalField(null=False, max_digits=7, decimal_places=2)
    price_2 = models.DecimalField(null=False, max_digits=7, decimal_places=2)
    availability = models.SmallIntegerField()```

【问题讨论】:

    标签: django-models django-database django-database-functions


    【解决方案1】:

    您可以使用__ 过滤您需要跨关系的值

    documentation中有很好的例子

    Hotel.objects.filter(
        city=your_city,
        room__rateplan__prices__date=your_date,
        room__rateplan__prices__price_1=your_price,
        room__rateplan__prices__availability=your_availability,
    ).distinct()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-07
      • 2021-03-19
      • 2016-06-17
      • 2021-12-20
      • 2018-08-28
      • 2018-05-20
      相关资源
      最近更新 更多