2012-08-23 19 views
7

Tengo dos modelos (Evento y Perfil de usuario) en una relación ManyToMany. Quiero seleccionar solo aquellos Eventos que tienen menos de un cierto número de Usuarios asociados a ellos. Por lo tanto, deben seleccionarse eventos en los que menos de 4 personas se hayan registrado.Filtro de consulta Django por número de objetos ManyToMany

En views.py que tienen algo como esto, pero no está funcionando:

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

Las partes pertinentes de la mirada models.py como:

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) 

supongo que no soy correctamente filtrando con todos los Userprofiles en cada evento, pero no sé cómo hacerlo.

puede ayudar?

+0

Eche un vistazo a los documentos o google para anotaciones y agregaciones con el ORM, debería comenzar. – Jingo

+0

He hecho. Estoy buscando consejos más específicos. Los filtros estándar dados parecen filtrarse según los atributos específicos de un solo objeto modelo relacionado en lugar de un conjunto de ellos. Supongo que estoy buscando información que parece un poco más esotérica. – KindOfGuy

+0

Uha, mirando el consejo de Yuji a continuación, me di cuenta de que no había investigado lo que dijiste. ¡Gracias por el consejo! – KindOfGuy

Respuesta

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

¡Magnífico! Tuve que agregar 'from django.db.models import Count' a models.py, por supuesto, pero esto funcionó. Yuji, eres un ciudadano muy fuerte e importante. – KindOfGuy

Cuestiones relacionadas