2010-05-17 17 views
6

(soy nuevo en Python y Django así que por favor tengan paciencia conmigo por un segundo. Me disculpo si esto ha sido contestada en otro lugar y no podía encontrarlo)Usando la aplicación django y django-voting, ¿cómo puedo pedir un queryset de acuerdo con los votos de cada artículo?

Digamos que tengo un modelo de Enlace ya través de la django -los usuarios de la aplicación de votación pueden votar en instancias de enlace. ¿Cómo puedo ordenar esas instancias de enlace de acuerdo a su puntaje, ej. mostrar aquellos con el puntaje más alto primero.

Supongo que podría usar el gestor get_top de django-voting, pero eso solo me daría las instancias de enlaces de mayor puntuación y no tomaría en consideración otros parámetros que quisiera agregar (por ejemplo, los enlaces que pertenecen a un usuario específico o paginación o lo que sea).

Supongo que escribiría un administrador personalizado para mi modelo de Enlace, donde puedo filtrar un conjunto de preguntas según el puntaje de cada elemento. Si entiendo correctamente eso requerirá que revise cada elemento, verifique su puntaje y luego coloque una lista (o diccionario) que luego será ordenada de acuerdo con el puntaje de cada elemento. Eso no devolvería un conjunto de consulta, sino un diccionario con cada elemento.

¿Falta algo aquí?

edición:

Aquí hay una versión reducida del modelo de Enlace:

class Link(models.Model): 
    user = models.ForeignKey('auth.User') 
    category = models.ForeignKey(Category) 
    date = models.DateTimeField(auto_now_add=True, null=True, blank=True) 
    is_deleted = models.BooleanField(default=False, blank=True) 
    links = ValidLinkManager() 
    objects = models.Manager() 

y cuando un usuario se califican que tienen esta en mi opinión:

Vote.objects.record_vote(link, user, vote) 

donde enlace es la instancia de enlace, el usuario es una instancia de auth.User y el voto es 1, 0 o -1. ValidLinkManager simplemente filtra los enlaces que tienen is_deleted establecido en True.

+0

¿Se puede publicar algún código, posiblemente como se ve el modelo de Link ...? – kafuchau

+0

bien aquí está ... –

+0

No estoy muy seguro de lo que estás tratando de hacer aquí. ¿Estás tratando de ordenar la visualización de los votos? – Brant

Respuesta

1

El método get_top en VoteManager no es tan complicado. Mira su código (en managers.py:122). Puede crear fácilmente una versión que acepte un filtro como otro parámetro y lo aplique al conjunto de consulta "objetos" después de crearlo, en la línea 158 - de esta manera puede agregar otros filtros como los que le faltan.

Tal vez también puede ofrecer eso como un parche nuevo a la Jonathan, y él lo puso en Django derecho a voto :)

0

yo decidimos utilizar una relación genérica en mi modelo:

votes = generic.GenericRelation(Vote) 

y después de agregar que:

my_model.objects.annotate(num_votes=Count('votes')) 

En este caso, sólo estoy contando el número de votos recibidos por los objetos, pero se puede cambiar Count con Avg para obtener un promedio.

Desde this does not work with Django by default, instalé django-generic-aggregation.

+0

gracias Paolo por la sintaxis – Bastian

Cuestiones relacionadas