2010-03-23 14 views
35

Esto es casi seguro una pregunta duplicada, en cuyo caso se disculpa, pero he estado buscando alrededor de media hora en SO y no puedo encontrar la respuesta aquí. Probablemente estoy usando los términos de búsqueda equivocados, lo siento.¿Ordenar por el recuento de un campo ForeignKey?

Tengo un modelo de usuario y un modelo de presentación. Cada envío tiene un campo ForeignKey llamado user_submitted para el usuario que lo subió.

class Submission(models.Model): 
    uploaded_by = models.ForeignKey('User') 
class User(models.Model): 
    name = models.CharField(max_length=250) 

Mi pregunta es bastante simple: ¿cómo puedo obtener una lista de los tres usuarios con más envíos?

He intentado crear un método num_submissions en el modelo de usuario:

def num_submissions(self): 
    num_submissions = Submission.objects.filter(uploaded_by=self).count() 
    return num_submissions 

y luego hacer:

top_users = User.objects.filter(problem_user=False).order_by('num_submissions')[:3] 

Pero esto no funciona, al igual que todas las otras cosas que he probado. ¿Puedo hacerlo usando una consulta de base de datos inteligente? ¿O debería hacer algo más hacky en el archivo de vistas?

Respuesta

84
from django.db.models import Count 
top_users = User.objects.filter(problem_user=False) \ 
       .annotate(num_submissions=Count('submission')) \ 
       .order_by('-num_submissions')[:3] 

usted no mencionó problem_user en el código de ejemplo modelo, pero lo he dejado en el supuesto de que se trata de un BooleanField en User.

+2

Muy bueno, funciona el evento con 'Profile.objects.annotate (num_items = Count ('user__item')) order order_by ('- num_items')' – skrat

+0

Hola, me gustaría preguntar si hay una manera de filtrar solo los usuarios con más envíos en las últimas 24 horas? Suponiendo que hay un campo de marca de tiempo en la Presentación. –

Cuestiones relacionadas