Django - 在具有不同值的组查询中求平均值

时间:2015-11-22 08:59:10

标签: python django django-models django-orm

我的问题与How to group by AND aggregate with Django

非常相似

这是我的模特:

class Author(models.Models):
    name = models.CharField(max_length=9)

class Book(models.Models):
    author = models.ForeignKey(Author)
    score = models.IntegerField()

这就是我想要做的事情:

select distinct(author__name, AVG(score) 
    from book 
    where author__name in ('A, 'B', 'C') 
    group by author__name order by avg desc;

这就是我的尝试:

print Book.objects.filter(author__name__in=['A', 'B', 'C'])\
                .values_list('author__name', 'score')\
                .annotate(avg=Avg('score'))

[('A', 22, 22), ('A', 24, 24), ('B', 50, 50), ('B', 52, 52)]

但我希望看到:

[('A', 23), ('B', 52)]

有没有办法在查询中正确地执行此操作(而不是在后处理代码中)?

1 个答案:

答案 0 :(得分:1)

您正尝试按作者姓名分组,因此请删除values_list中的if (!$(this).val() && $(this).val().length === 0)avg_depth会为每位作者添加平均annotate。你可以这样做:

score/avg_depth

此处result = Book.objects.filter(author__name__in=['A','B','C']).values_list('author__name').annotate(Avg('score')) 用于按作者姓名分组,values_list将计算每位作者的平均分数,然后使用Avg('score')

为每位作者添加注释