Django annotate正在生成一个不正确的GROUP BY语句

时间:2013-01-13 01:49:04

标签: django

我正在使用Django。我有三种不同的模型,使用这种父子布局:

申请人>应用 - >综述

申请人可以拥有多个可以进行多次审核的申请。

我正在尝试编写一个包含名字,姓氏,应用程序ID以及与某个人相关的评论数量的查询,这些评论可能是无数个。我有以下查询语句:

list = MUSApplicant.objects.values( 'applicant', 'id', 'applicant__first_name', 'applicant__last_name', 'review').filter(department=department).annotate(acount=Count('review'))

给了我这个SQL:

    SELECT apply_application.applicant_id, 
    apply_application.id, 
    apply_applicant.first_name, 
    apply_applicant.last_name, 
    apply_review.id, 
    COUNT(apply_review.id) AS acount 
    FROM apply_application 
    INNER JOIN apply_applicant 
    ON (apply_application.applicant_id = apply_applicant.id) 
    LEFT OUTER JOIN apply_review 
    ON (apply_application.id = apply_review.applicant_id) 
    WHERE apply_application.department = 'departmentname'
    GROUP BY apply_application.applicant_id, apply_application.id, apply_applicant.first_name, apply_applicant.last_name, apply_review.id

哪个非常接近,但结果不正确 - 我最终得到了太多未正确分组的行。我只希望它通过apply_review.id进行分组,而不是其他所有内容。如何防止它将所有这些额外的东西添加到我的GROUP BY语句中?

我无休止地盯着文档无济于事。有时候很难将你的确切数据模型与那里的几个例子相匹配,以便学习任何东西。

编辑:这是模型:

class Review(models.Model):
    reviewer_eid = models.CharField(max_length=20)
    applicant = models.ForeignKey('Application')
    overall_score = models.FloatField()
    category1 = models.FloatField()
    category2 = models.FloatField()
    category3 = models.FloatField()
    comments = models.TextField()

1 个答案:

答案 0 :(得分:1)

我明白了。我需要Count('review__applicant')而不是Count('review')。我发现那些额外的GROUP BY语句确实没有效果,因为它们也在SELECT子句中。