Django注释子查询的聚合

标签 django django-orm django-aggregation django-annotate

所以我有三个模型

class Advert(BaseModel):
    company = models.ForeignKey(Company, on_delete=CASCADE, related_name="adverts")

class Company(BaseModel):
    name = models.CharField(max_length=50)

class OrderRating(BaseModel):
    reported_company = models.ForeignKey(Company, on_delete=CASCADE, related_name='ratings')
    rating = models.DecimalField(
        max_digits=2,
        decimal_places=1,
        validators=[MinValueValidator(1.0), MaxValueValidator(5.0)],
        help_text='Rating from 1.0 to 5.0.'
    )

当我这样做时,我试图获取与该公司相关的所有订单评级的平均值,并将其注释到 Advert 模型中:

 qs = Advert.objects.all().annotate(
        avg_rating=Subquery(
            OrderRating.objects.filter(
               reported_company=OuterRef('company')).aggregate(Avg("rating"))["rating__avg"]
            )
        )

我回来说明

This queryset contains a reference to an outer query and may only be used in a subquery.'

当我在 Subquery 中调用 OuterRef 时,不确定问题出在哪里。

最佳答案

根据我的经验子查询通常有点棘手并且没有很好的文档记录。当定义子查询的代码中存在一些错误时,它们往往会返回您收到的消息(确实不是一个非常有用的消息)。

据我所知,aggregateSubequeries 中不起作用,您必须使用annotations 来代替。所以这应该有效:

qs = Advert.objects.all().annotate(
        avg_rating=Subquery(
            OrderRating.objects.filter(
               reported_company=OuterRef('company')).values('reported_company').annotate(av=Avg('rating')).values('av')
            )
        )

关于Django注释子查询的聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60114424/

相关文章:

django - 项目中的每个 django 应用程序都应该有自己的 urls.py 吗?

django - 使用日期时间字段按天对 Django 模型条目进行分组

python - 按照 celery 教程,我收到此错误 No module named 'src'

python - Django + 博托 + Python 3

Django 在 save() 时自动压缩模型字段并在访问字段时解压缩

django - 初始化模型字段,包括 manytomanyfields

Django : Count only non-empty CharField with annotate() & values()

python - 在 Django 中使用聚合获取最小值字段名称

sql - 将字符串匹配到 Postgres 数据库列中的字符串数组

python - Django 按条件过滤