Question

J'ai un queryset pour le moment qui retourne les éléments numériques dans un modèle commandé par le nombre de personnes qui le surveillent.Donc, j'ai un champ M2M représentant ce lien.

IE:

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

Je compterais le nombre d'occurrences et je les commanderais en comptant dans un gestionnaire par défaut qui a ensuite été utilisé par la vue.

maintenant je vais utiliser Django-notification , en utilisant 'notification.observedItem'Autoriser les utilisateurs à regarder une instance si MyModel.

Donc, à mon avis, lorsqu'un utilisateur pose un certain contenu, j'ai quelque chose comme ceci:

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

Cela fonctionne bien.

Maintenant, comment puis-je générer un querySet représentant tous les objets de la classe MyModel, commandé par le nombre de personnes "les observant"?

Était-ce utile?

La solution

Vous pouvez accomplir cela en utilisant des annotations:

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

Autres conseils

Le problème est que Django-Notification utilise des clés étrangères génériques.

J'ai donc redéfini mon domaine de surveillance:

watchers = generic.GenericRelation(notification.ObservedItem)

Puis je peux obtenir tous les observateurs d'une instance spécifique de MyModel.

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

Fermer mais pas de cigare. Je voulais faire était quelque chose comme ceci:

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

Quel est quelque chose que Django ne peut pas faire, Selon les docs .

L'API d'agrégation de la base de données de Django ne fonctionne pas avec une générosité.

Ne vous inquiétez pas, je pense que cela aidera probablement:

http://charlesleifer.com/blog/menerating-agregistrate -Data-fring-générique-relations /

repo est ici:

https://github.com/coleifer/django-generico-aggre < / p>

Je n'ai pas encore essayé ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top