[英]Django ORM Count by Related Field
我有以下型號:
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。 那么,如何才能通過按具有指定角色的成員數進行排序?
最后,找到了解決方案(僅在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')
如果您要按“直通”模型字段過濾查詢集,然后根據相關字段計數對結果集進行排序,
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.