Django的;按相关对象计数查询数据库

时间:2017-09-21 06:16:03

标签: python django django-orm

我有一个问题模型:

class Answer(models.Model):
    user = models.ForeignKey(User)
    question = models.ForeignKey(Question, on_delete=models.CASCADE)

和与之相关的答案模型:

{{1}}

我想过滤掉所有没有答案的问题。我怎么能在视图中做到这一点?

1 个答案:

答案 0 :(得分:4)

以下查询获取所有与答案无关的问题:

Question.objects.annotate(answer_count=Count('answer')).filter(answer_count=0)

<强>更新
您可以按照与过滤方法中的实际模型字段相同的每个annotate参数进行操作,例如,所有具有三个以上答案的问题:

Question.objects.annotate(answer_count=Count('answer')).filter(answer_count__gt=3)

注意:
注释方法如何工作?
在所有关系-db ORM事务的后面,SQL语言处理事务,并且SQL更喜欢一些额外的函数,这些函数在许多操作中具有更大的灵活性,特别是在SELECT语句中,对于样本,有时我们需要多个列的平均值或列数行,见下文:

SELECT count(*) from my_table;

如果上count函数不首选,我们必须首先获取所有记录,并在另一步计算结果长度,这种方法很难并且有许多优点。
Django ORM优先使用相同的SQL可用函数,这些函数只能在注释函数中使用并在运行之前转换为SQL。

More info aboute annotate method