Pregunta

Tengo un conjunto de consultas en este momento que devuelve los elementos del número en un modelo ordenado por el número de personas que lo miran.Así que tengo un campo M2M que representa este enlace.

IE:

#models.py
class MyModel(models.Model):
...
watchers = models.ManyToManyField(User, blank=True)

Cuento la cantidad de ocurrencias y los ordenaría por cuenta con un administrador predeterminado que luego fue utilizado por la vista.

Ahora voy a usar notificación django , usando 'Notification.observeditem'Permitir a los usuarios ver una instancia si Mymodel.

Entonces, en mi opinión, cuando un usuario publica un poco de contenido, tengo algo como esto:

notification.observe(object, request.user, 'new_object')

Esto funciona bien.

Ahora, ¿cómo puedo generar un consulta que representa todos los objetos de la clase Mymodel, ordenada por el número de personas que los observan?

¿Fue útil?

Solución

Puede lograr que al usar anotaciones:

from django.db.models import Count
MyModel.objects.annotate(num_users=Count('watchers')).order_by('num_users')

Otros consejos

El problema es que Django-Notificación utiliza llaves extranjeras genéricas.

Así que he redefinido a mi campo de observadores:

watchers = generic.GenericRelation(notification.ObservedItem)

Luego, puedo obtener a todos los observadores para una instancia específica de Mymodel.

$x = MyModel.objects.get(id=1)
$x.watchers.all()
$[<ObservedItem: ObservedItem object>, <ObservedItem: ObservedItem object>, <ObservedItem: ObservedItem object>]
$x.watchers.count()
$3

Cerrar pero no hay cigarro. Yo quería hacer era algo así:

MyModel.objects.annotate(count=Count('watchers')).order_by('count')

que es algo que Django no puede hacer, de acuerdo con los docs .

La API de agregación de la base de datos de Django no funciona con una genericRelación.

No se preocupe, creo que esto probablemente ayudará:

http://charlesleifer.com/blog/generating-aggregate -Data-Relaciones genéricas /

repo está aquí:

https://github.com/coleifer/django-generic-aggregation < / p>

No lo he probado todavía ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top