如何在django中为给定的id列表获取单独的记录总数

时间:2016-11-19 16:19:41

标签: python django django-models

我正在使用问答解答论坛。

我想做的事情非常简单。

在问题列表页面中,我想显示问题的答案总数。

我知道如何从问题记录中获得所有答案 -

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

我该怎么做?谢谢你的帮助!

2 个答案:

答案 0 :(得分:0)

这里的方法是列表理解:

[Answer.objects.filter(question = question_record).count() for question_record in Question.ojects.all()]

答案 1 :(得分:0)

您希望在GROUP BYquestions,并为每个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中的每个对象   将使用指定的值进行注释。