【问题标题】:Django; Querying the Database By Counts Of Related Objects姜戈;按相关对象计数查询数据库
【发布时间】:2018-03-02 09:06:38
【问题描述】:

我有一个问题模型:

class Question(models.Model):
....

以及与之相关的答案模型:

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

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

【问题讨论】:

  • 你想要特定的用户问题过滤器吗?
  • @Shaonshaonty 不,我只希望每个问题都没有答案!
  • 提及表...

标签: python django django-orm


【解决方案1】:

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

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

更新:
您可以将每个annotate 参数的行为与过滤方法中的真实模型字段相同,例如所有答案超过三个的问题:

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

注意:
注释方法是如何工作的?
在所有由 SQL 语言处理的关系数据库 ORM 事务的后面,SQL 更喜欢一些额外的函数,这些函数在许多操作中提供了更大的灵活性,特别是在 SELECT 语句中,例如,有时我们需要多行中列的平均值或计数,见下文:

SELECT count(*) from my_table;

如果不喜欢上面的count函数,我们必须先获取所有记录,然后再计算结果的长度,这种方法比较困难,有很多优点。
Django ORM 更喜欢相等的 SQL 可用函数,这些函数只能在注释函数中使用并在运行前转换为 SQL。

More info aboute annotate method

【讨论】:

  • 先生,它引发了错误“无法将关键字'answer_set'解析为字段”。将 answer_set 替换为 'answer' 表示“Count is an invalid lookup”。我该怎么办?
  • 你没有确定相关字段,我认为这个名称是 django 的默认名称
  • 非常感谢先生。现在工作得很好:)
  • :) 我很高兴它成功了,我很高兴你很高兴
  • 阅读笔记部分:)
猜你喜欢
  • 2016-05-02
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
  • 2021-09-27
  • 2021-09-13
  • 2020-08-05
  • 2013-02-22
  • 2016-04-28
相关资源
最近更新 更多