简体   繁体   English

Django ORM按相关字段计数

[英]Django ORM Count by Related Field

I have the following models: 我有以下型号:

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)

So, I try to order teams by count of profiles with a certain role, and I had a query, which doesn't work: 因此,我尝试按具有特定角色的个人资料来对团队进行排序,但我有一个查询,该查询不起作用:

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

It raises the following Exception: 它引发以下异常:

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

because role is a TeamMember field, not Profile. 因为角色是TeamMember字段,而不是Profile。 So, how can I achieve ordering by count of members with a specified role? 那么,如何才能通过按具有指定角色的成员数进行排序?

最后,找到了解决方案(仅在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')

If you want to filter the queryset by 'through' model field and then want to order the result set based on related field count, 如果您要按“直通”模型字段过滤查询集,然后根据相关字段计数对结果集进行排序,

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')

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM