Django查询以注释匹配特定值

时间:2016-08-18 10:21:53

标签: python django orm django-queryset

如果我有以下相关型号:

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,但我不确定它们会如何应用于这种情况。

1 个答案:

答案 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()应用于结果,以便仅返回具有多个电子邮件身份的用户。