2012-08-23 3 views
7

Ho due modelli (Event e UserProfile) in una relazione ManyToMany. Voglio selezionare solo quegli eventi che hanno meno di un certo numero di utenti ad essi associati. Quindi gli eventi in cui meno di 4 persone hanno finora firmato dovrebbero essere selezionati.Filtro query Django per numero di oggetti ManyToMany

In views.py Ho qualcosa di simile, ma non funziona:

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

Le parti pertinenti aspetto models.py come:

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) 

Credo Io non sono correttamente filtraggio con tutti i profili utente su ciascun evento, ma non so come farlo.

Potete essere d'aiuto?

+0

Si prega di dare un'occhiata al documento o google per annunamenti e aggregazioni con l'ORM, dovrebbe iniziare. – Jingo

+0

Ho fatto. Sto cercando consigli più specifici. I filtri standard forniti sembrano filtrare in base agli attributi specifici di un singolo oggetto modello correlato anziché a un insieme di essi. Suppongo di cercare informazioni che sembrino un po 'più esoteriche. – KindOfGuy

+0

Uha, guardando il consiglio di Yuji in basso, ho capito che non avevo esaminato quello che hai detto. Grazie per il consiglio! – KindOfGuy

risposta

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

Superbo! Ho dovuto aggiungere 'from django.db.models import Count' a models.py, ovviamente, ma questo ha funzionato. Yuji, sei un cittadino molto forte e importante. – KindOfGuy