如果我有以下相关型号:
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
个实例,其类别为“email”,指向相同的User
。
我见过Django 1.8 introduced Conditional Expressions,但我不确定它们会如何应用于这种情况。
答案 0 :(得分:0)
通过应用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)
)
因此,我们使用use .annotate()
创建一个聚合字段,表示每个用户的电子邮件身份数,然后将.filter()
应用于结果,以便仅返回具有多个电子邮件身份的用户。