Pergunta

No momento, tenho um conjunto de consultas que retorna o número de itens em um modelo ordenado pelo número de pessoas que o assistem.Então eu tenho um campo m2m representando esse link.

Ou seja:

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

Eu contaria o número de ocorrências e as ordenaria por contagem em um gerenciador padrão que seria então usado pela visualização.

Agora vou usar notificação Django, usando 'notification.ObservedItem' para permitir que os usuários observem uma instância se MyModel.

Então, na minha opinião, quando um usuário posta algum conteúdo, tenho algo assim:

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

Isso funciona bem.

Agora, como posso gerar um queryset representando todos os objetos da classe MyModel, ordenados pelo número de pessoas que os 'observam'?

Foi útil?

Solução

Você pode fazer isso usando anotações:

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

Outras dicas

O problema é que a notificação do Django usa chaves estrangeiras genéricas.

Então redefini meu campo de observadores:

watchers = generic.GenericRelation(notification.ObservedItem)

Então posso obter todos os observadores para uma instância específica do MyModel.

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

Perto, mas sem charuto.Eu queria fazer era algo assim:

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

O que é algo que o Django não pode fazer, de acordo com os documentos.

A API de agregação de banco de dados do Django não funciona com GenericRelation.

Não se preocupe, acho que isso provavelmente ajudará:

http://charlesleifer.com/blog/generating-gregate-data-across-generic-relations/

O repositório está aqui:

https://github.com/coleifer/django-generic-agregação

Ainda não experimentei...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top