【问题标题】: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() 应用于结果以仅返回具有多个电子邮件身份的用户。

【讨论】:

    猜你喜欢
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-17
    • 1970-01-01
    • 2021-09-11
    相关资源
    最近更新 更多