【发布时间】:2018-02-24 15:53:42
【问题描述】:
我在 Airbnb 之类的应用程序上工作。我有一个Flat 型号和Price 型号,价格有不同类型的优先级,这允许客户创建灵活的价格范围。
我坚持一个复杂的查询。此查询应按日期范围返回 Flats 并计算此范围的价格。
这里是我的模型部分:
class Flat(models.Model):
prices = models.ManyToManyField(
'Price'
related_name='flats'
)
price = models.PositiveIntegerField()
...
class Price(models.Model):
PRIORITY_CHOICES = ((i, i) for i in range(1, 6))
priority = PositiveIntegerField(choices=PRIORITY_CHOICES)
start_date = models.DateField()
end_date = models.DateField()
price = models.PositiveIntegerField()
到目前为止,我已经弄清楚了如何每天以更高的优先级注释价格。我为 Flat 编写了一个自定义管理器:
class FlatManager(models.Manager):
def with_prices(self, start, end):
days = get_days(start, end) # utils function return list of days
prices = {}
for day in days:
prices[str(day)] = models.Subquery(
Price.objects.filter(
flats=models.OuterRef('pk')).
filter(start_date__lte=day, end_date__gte=day).
order_by('-priority').
values('price')[:1]
)
return self.annotate(**price_dict)
这是我的问题:
Flat 中的某些日期可能没有价格限制,因此 Flat 有自己的 price 字段,用于客户不使用灵活价格的情况。我不知道我需要在查询中在哪里添加条件运算符。如果我在Price 子查询中添加它,那么由于嵌套,我无法使用Outref('price')。
当我解决它时,我认为计算聚合值的总和对我来说不会那么复杂。
请至少给一些提示,我真的坚持下去。
【问题讨论】:
标签: python django django-models django-queryset