【问题标题】:Django ORM Count by Related Field相关字段的 Django ORM 计数
【发布时间】:2018-06-03 02:48:26
【问题描述】:

我有以下型号:

class Profile(models.Model):
    pass

class Team(models.Model):
    ...
    members = models.ManyToManyField("main.Profile", through='main.TeamMember')

class TeamMember(models.Model):
    profile = models.ForeignKey('Profile')
    team = models.ForeignKey('Team')
    role = models.CharField(max_length=255)

因此,我尝试按具有特定角色的个人资料数量对团队进行排序,但我有一个查询,但它不起作用:

Team.objects.filter(members__role='ExampleRole').annotate(example_role_count=Count('members')).order_by('example_role_count')

它引发以下异常:

django.core.exceptions.FieldError: Related Field got invalid lookup: role

因为角色是 TeamMember 字段,而不是 Profile。那么,如何实现按指定角色的成员数量排序呢?

【问题讨论】:

    标签: python django django-models orm django-orm


    【解决方案1】:

    终于找到了解决方案(仅适用于 Django >= 1.11)

    queryset = Team.objects.annotate(example_role_count=Subquery(TeamMember.objects.filter(role='example_role', team=OuterRef('pk')).values('team').annotate(cnt=Count('pk')).values('cnt'), output_field=IntegerField())).order_by('-example_role_count')
    

    【讨论】:

      【解决方案2】:

      如果您想通过“通过”模型字段过滤查询集,然后想根据相关字段计数对结果集进行排序,

      from django.db.models import Count
      
      # descending order
      Team.objects.filter(teammember__role='ExampleRole').annotate(example_role_count=Count('members')).order_by('-example_role_count')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-25
        • 2020-01-30
        • 2017-07-02
        • 2018-11-25
        • 2015-10-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多