2012-08-23 14 views
7

Ich habe zwei Modelle (Event und UserProfile) in einer ManyToMany-Beziehung. Ich möchte nur solche Ereignisse auswählen, denen weniger als eine bestimmte Anzahl von Benutzern zugeordnet ist. Daher sollten Veranstaltungen ausgewählt werden, bei denen sich bisher weniger als 4 Personen angemeldet haben.Django-Abfragefilter nach Anzahl der ManyToMany-Objekte

In views.py Ich habe so etwas wie dies, aber es funktioniert nicht:

proposed_event_list = Event.objects.all().filter(userprofile__lt=4) 

Die relevanten Teile models.py wie folgt aussehen:

class Event(models.Model): 
    name = models.CharField(max_length=100) 
    date = models.DateTimeField('Event date') 

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    event_commitments = models.ManyToManyField(Event, null=True, blank=True) 

Ich glaube, ich bin nicht richtig Filterung mit allen Userprofiles bei jeder Veranstaltung, aber ich weiß nicht wie.

Können Sie helfen?

+0

Bitte werfen Sie einen Blick in die Dokumentation oder Google für Annotierungen und Aggregationen mit dem ORM, sollten Sie beginnen. – Jingo

+0

Ich habe getan. Ich suche nach spezifischeren Ratschlägen. Die angegebenen Standardfilter scheinen nach spezifischen Attributen eines einzelnen verwandten Modellobjekts zu filtern, statt nach einer Gruppe von ihnen. Ich glaube, ich suche nach Informationen, die etwas esoterischer erscheinen. – KindOfGuy

+0

Uha, als ich Yujis Ratschlag betrachtete, wurde mir klar, dass ich nicht darauf geachtet hatte, was du gesagt hast. Danke für den Hinweis! – KindOfGuy

Antwort

11
Event.objects.annotate(c=Count('userprofile')).filter(c__lt=4) 
+0

Hervorragend! Ich musste natürlich '' from django.db.models import Count '' in models.py hinzufügen, aber das hat funktioniert. Yuji, du bist ein sehr starker und wichtiger Bürger. – KindOfGuy

Verwandte Themen