聚合外键属性

Aggregate over foreign key attributes

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

这是我的模型

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 做到这一点?

是的,您可以使用:

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
}