Python Django中仅在某些字段上聚合的条件批注
让我们假设我的Django项目中有两个数据库Python Django中仅在某些字段上聚合的条件批注,python,sql,django,Python,Sql,Django,让我们假设我的Django项目中有两个数据库 class Article(models.Model): name = models.CharField(max_length=200) # .. class Price(models.Model): article = models.ForeignKey('Article') date = models.DateTimeField(auto_now_add=True) price = models.DecimalField(
class Article(models.Model):
name = models.CharField(max_length=200)
# ..
class Price(models.Model):
article = models.ForeignKey('Article')
date = models.DateTimeField(auto_now_add=True)
price = models.DecimalField()
# ..
同一物品每天存在多个价格条目
现在,我想用前一天每篇文章的平均价格对一篇文章queryset进行注释。但我不知道如何在一个高效的查询中做到这一点
我所做的是:
articles = Articles.objects.all().select_related().filter(price__date__exact=datetime.datetime.now() - datetime.timedelta(days=1)).annotate(avg_price=Avg('price__price'))
如果每件商品每天至少有一个价格,这是可行的。但情况并非总是如此。前一天没有价格的物品的平均价格应该为None或0或默认值
有人知道如何实现这一点吗?聚合函数可以采用一个参数,该参数可用于为聚合设置条件:
from django.db.models import Q
articles = Articles.objects.all().select_related().annotate(
avg_price=Avg(
'price__price',
filter=Q(price__date__exact=datetime.datetime.now() - datetime.timedelta(days=1))
)
)
我不知道我怎么会错过这个阅读文档几个小时,但非常感谢你!这正是我需要的