Domanda

Ho un querySet al momento che restituisce le voci del numero in un modello ordinato dal numero di persone che lo guardano.Quindi ho un campo M2M che rappresenta questo link.

IE:

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

Contetterei il numero di occorrenze e ordinerli contando in un gestore predefinito che è stato quindi utilizzato dalla vista.

Ora sto andando a usare django-notifica , usando 'Notification.observeditem'Per consentire agli utenti di guardare un'istanza se mymodel.

Quindi, a mio avviso, quando un utente pubblica alcuni contenuti che ho qualcosa del genere:

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

funziona bene.

Ora, come posso generare un querySet che rappresenta tutti gli oggetti della classe MyModel, ordinati dal numero di persone "osservandoli"?

È stato utile?

Soluzione

È possibile eseguire ciò utilizzando annotazioni:

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

Altri suggerimenti

Il problema è che Django-Notifica utilizza chiavi straniere generiche.

Quindi ho ridefinito il mio campo degli osservatori:

watchers = generic.GenericRelation(notification.ObservedItem)
.

Allora posso ottenere tutti gli osservatori per un'istanza specifica di MyModel.

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

Chiudi ma nessun sigaro. Volevo fare era qualcosa del genere:

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

Che è qualcosa che Django non può fare, Secondo i documenti .

.

L'API dell'aggregazione del database di Django non funziona con una generacrelation.

Non preoccuparti, penso che questo probabilmente ti aiuterà:

http://charlesleifer.com/blog/generating-aggregate -Data-attraverso-relazioni generiche /

REPO è qui:

https://github.com/coleifer/django-generic-ggregation < / P >.

Non l'ho già provato ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top