我正在使用问答解答论坛。
我想做的事情非常简单。
在问题列表页面中,我想显示问题的答案总数。
我知道如何从问题记录中获得所有答案 -
answer_records = Answer.objects.filter(question = question_record).count()
但是,我想要一个单独的查询,它为所有给定的问题记录生成单独的答案记录数量。到目前为止,我已经尝试过 -
answer_records = Answer.objects.filter(question__in = question_records).count()
它只生成所有问题记录的单个计数。
这是我的模特 -
class Question(models.Model):
question_text = models.CharField(max_length = 500)
pub_date = models.DateTimeField('date published')
views = models.BigIntegerField(default = 0)
status = models.BooleanField(default = True)
def __str__(self):
return self.question_text
class Answer(models.Model):
question = models.ForeignKey(Question, on_delete = models.CASCADE, blank = True, null = True)
answer_text = models.TextField(default = '')
pub_date = models.DateTimeField(default = timezone.now)
def __str__(self):
return self.answer_text
我该怎么做?谢谢你的帮助!
答案 0 :(得分:0)
这里的方法是列表理解:
[Answer.objects.filter(question = question_record).count() for question_record in Question.ojects.all()]
答案 1 :(得分:0)
您希望在GROUP BY
上questions
,并为每个COUNT
返回question
个答案。为实现此目的,您可以使用.annotate()
作为:
Answer.objects.filter(question__in= question_records) \
.values('question') \
.annotate(question_count= COUNT('question'))
另请查看Django's Document on "Generating aggregates for each item in a QuerySet"。你会发现它很有用。
values()
:指定将哪些列用于“分组依据”
Django docs:
“当使用values()子句约束列时 在结果集中返回,评估注释的方法是 稍微不一样。而不是为每个返回带注释的结果 结果在原始QuerySet中,原始结果被分组 根据中指定的字段的唯一组合 values()子句“
annotate()
:指定对分组值
Django docs:
生成汇总值的第二种方法是为QuerySet中的每个对象生成一个独立的摘要。例如,如果你 正在检索书籍列表,您可能想知道有多少作者 为每本书做出了贡献。每本书都有多对多的关系 与作者;我们想要总结每本书的这种关系 在QuerySet中。
可以使用annotate()子句生成每个对象的摘要。 当指定annotate()子句时,QuerySet中的每个对象 将使用指定的值进行注释。