2017-12-20 6 views
0

Ich habe die folgenden Modelle:Django ORM von verwandten Bereich

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) 

Also, ich versuche Teams nach Anzahl der Profile mit einer bestimmten Rolle zu bestellen, und ich hatte eine Abfrage, die nicht funktioniert:

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

Es stellt sich die folgende Ausnahme:

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

weil Rolle ein Teammitglied Feld ist nicht Profil. Also, wie kann ich die Bestellung durch die Anzahl der Mitglieder mit einer bestimmten Rolle erreichen?

Antwort

0

Schließlich fand eine Lösung (funktioniert nur in 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') 
0

Wenn Sie die queryset von ‚bis‘ Modellfeld filtern wollen und dann basierend auf verwandten Bereich die Ergebnismenge bestellen zählen,

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