Django 在模型字段上注释 Avg

Posted

技术标签:

【中文标题】Django 在模型字段上注释 Avg【英文标题】:Django annotate Avg on model field 【发布时间】:2018-03-21 17:56:04 【问题描述】:

我有这些模型:

class Agency(models.Model):
    pass


class User(models.Model):
    agency = models.ForeignKey(Agency)


class Feedback(models.Model):
    rating = models.DecimalField()
    user = models.ForeignKey(User)

我想用所有评分的平均值来注释查询集。我希望这会起作用:

Feedback.objects.annotate(avg_rating=Avg('rating')).values('rating', 'avg_rating')

但它只是输出这个:

<QuerySet ['rating': 0.8, 'avg_rating': 0.8, 'rating': 0.2, 'avg_rating': 0.2, 'rating': 0.6, 'avg_rating': 0.6, 'rating': 1.0, 'avg_rating': 1.0, 'rating': 0.4, 'avg_rating': 0.4]>

如您所见,平均值应为 3.0。我哪里错了?

为了清楚起见,我正在尝试做这样的事情:

agencies = Agency.objects.annotate(
    avg_rating=Coalesce(Subquery(
        Feedback.objects.filter(user__agency_id=OuterRef('pk'))
        .values('rating')
        .annotate(avg_rating=Avg('rating', output_field=DecimalField()))
        .values('avg_rating')
    ), 0)
)

平均评级是每个机构。有什么想法吗?

【问题讨论】:

您是否试图找出特定用户的平均评分?还是属于一个机构的所有用户?你能用语言描述一下用例是什么吗? 【参考方案1】:
Feedback.objects.aggregate(avg_rating=Avg('rating'))

【讨论】:

我需要将它附加到每个实例。所以必须注释 你能给出代理和反馈之间的关系吗?外键?【参考方案2】:

不妨试试这个:

agencies = Agency.objects.annotate(
avg_rating=Coalesce(Subquery(
    Feedback.objects.values('user__agency')
    .annotate(avg_rating=Avg('rating', output_field=DecimalField()))
    .values('avg_rating')
), 0)))

【讨论】:

以上是关于Django 在模型字段上注释 Avg的主要内容,如果未能解决你的问题,请参考以下文章

对中间模型 django 的一个字段进行注释

Django 在 json 字段中注释特定键

如何使用注释在 Django ORM 中创建通知日期字段

python测试开发django-194.addcomments 模块生成mysql表字段注释

如何在 Django QuerySet 中注释两个字段的最大值

Django:根据字段的状态对 Sum Case 进行注释