2017-12-20 20 views
0

나는 다음과 같은 모델이 있습니다장고 ORM 관련 분야에서 카운트

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) 

그래서, 내가 어떤 역할 프로파일의 개수에 의해 팀을 주문하려고, 나는이 작동하지 않는 쿼리를했다 :

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

역할이 TeamMember 필드이기 때문에, 프로필하지 :

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

그것은 다음과 같은 예외를 발생시킵니다. 그렇다면 어떻게 특정 역할을 가진 회원 수로 주문할 수 있습니까?

답변

0

마지막 해결책 발견 (단지 장고 작동을> = 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') 
0

당신이 모델 필드 '를 통해'으로의 검색어를 필터링 할 후 관련 분야에 따라 결과 세트를 주문하려면 개수,

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