簡體   English   中英

Django ORM按相關字段計數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM