汇总外键属性

时间:2018-06-21 08:21:45

标签: django django-models django-postgresql

我想知道已向特定用户提出的问题数量。

这是我的模特

class TrueOrFalseQuestion(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    content = models.TextField(default='', blank=True)
    explanation = models.TextField(default='', blank=True)

class TrueOrFalseUserQuestion(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    creator = models.ForeignKey(User, on_delete=models.CASCADE)
    question = models.ForeignKey(TrueOrFalseQuestion, related_name='user_questions', on_delete=models.CASCADE)

有人创建了一个问题,然后当我想为特定用户显示该问题时,我创建了一个TrueOrFalseUserQuestion(并将用户分配为creator)。

我想知道问题已显示给每个用户多少次。假设ID为1的用户有5个TrueOrFalseUserQuestion,而用户2有3个,那么我想得到这个结果

{"1": 5, "2": 3}

使用Python很容易,但是我认为它会带来较差的性能,有没有办法使用Django ORM做到这一点?

2 个答案:

答案 0 :(得分:1)

是的,您可以使用:

from django.db.models import Count

qs = TrueOrFalseUserQuestion.objects.filter(
    question=some_question
).values(
    'creator'
).annotate(
    times=Count('id')
).order_by(
    'creator'
)

使用some_question,我们要获得计数的问题。

这将产生QuerySet个字典,例如:

<QuerySet [{'creator': 1, 'times': 5}]>

然后我们可以使用字典理解,例如:

result = {
    q['creator'] : q['times'] for q in qs
}

答案 1 :(得分:0)

如果我没记错的话,您需要进行Group By聚合,

from django.db.models import Count

TrueOrFalseUserQuestion.objects.values('creator_id').annotate(max_question=Count('question'))