我现在有一个查询集,它返回按照观看人数排序的模型中的数字项。所以我有一个代表这个链接的m2m字段。
即:
#models.py
class MyModel(models.Model):
...
watchers = models.ManyToManyField(User, blank=True)
我会计算出现次数并按默认管理器中的计数对它们进行排序,然后由视图使用。
现在我要使用django-notification,使用'notification.ObservedItem'来允许用户在MyModel中观看实例。
所以在我看来,当用户发布一些内容我有类似的东西:
notification.observe(object, request.user, 'new_object')
这很有效。
现在,我如何生成一个表示MyModel类的所有对象的查询集,按照“观察”它们的人数排序?
答案 0 :(得分:1)
您可以使用注释来完成此操作:
from django.db.models import Count
MyModel.objects.annotate(num_users=Count('watchers')).order_by('num_users')
答案 1 :(得分:1)
问题是django-notification使用通用外键。
所以我重新定义了我的观察者字段:
watchers = generic.GenericRelation(notification.ObservedItem)
然后我可以获取MyModel特定实例的所有观察者。
$x = MyModel.objects.get(id=1)
$x.watchers.all()
$[<ObservedItem: ObservedItem object>, <ObservedItem: ObservedItem object>, <ObservedItem: ObservedItem object>]
$x.watchers.count()
$3
关闭但没有雪茄。我想做的是这样的事情:
MyModel.objects.annotate(count=Count('watchers')).order_by('count')
这是Django无法做到的事情,according to the docs。
Django的数据库聚合API不适用于GenericRelation。
不用担心,我认为这可能会有所帮助:
http://charlesleifer.com/blog/generating-aggregate-data-across-generic-relations/
回购在这里:
https://github.com/coleifer/django-generic-aggregation
我还没试过......