Python 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(

让我们假设我的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()
  # ..
同一物品每天存在多个价格条目

现在,我想用前一天每篇文章的平均价格对一篇文章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))
    )
)

我不知道我怎么会错过这个阅读文档几个小时,但非常感谢你!这正是我需要的