【问题标题】:Django query to annotate number of foreign keys matching certain valueDjango查询注释匹配特定值的外键数量
【发布时间】:2016-12-25 05:41:38
【问题描述】:
如果我有以下相关模型:
class User(models.Model):
...
class Identity(models.Model):
user = models.ForeignKey(User, on_delete=models.PROTECT)
category = models.CharField(max_length=8, choices=IDENTITY_CATEGORIES)
...
我如何查询具有多个电子邮件身份的用户,其中存在多个“电子邮件”类别的Identity实例,它们指向同一个User。
我见过Django 1.8 introduced Conditional Expressions,但我不确定它们将如何适用于这种情况。
【问题讨论】:
标签:
python
django
orm
django-queryset
【解决方案1】:
通过应用django.db.models.Sum,这是实现它的一种方法:
from django.db.models import Case, IntegerField, Sum, When
def users_with_multiple_email_identities():
"""
Return a queryset of Users who have multiple email identities.
"""
return (
User.objects
.annotate(
num_email_identities=Sum(
Case(
When(identity__category='email', then=1),
output_field=IntegerField(),
default=Value(0)
)
)
)
.filter(num_email_identities__gt=1)
)
因此,我们使用 .annotate() 创建一个聚合字段,表示每个用户的电子邮件身份数量,然后将.filter() 应用于结果以仅返回具有多个电子邮件身份的用户。