聚合外键属性
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
}
我想知道已向特定用户提出的问题数量。
这是我的模型
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
}