2012-07-27 63 views
1

我有一个查询集,在返回按照观看人数排序的模型中的数量项。所以我有一个代表这个链接的m2m字段。django-notification:有多少观察项目

即:

#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类的所有对象的查询集,按照人们观察它们的次数排序呢?

回答

1

可以完成,通过使用注释:

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

你说得对,我认为注释应该发生在MyModel上,而不是编辑答案。 – 2012-07-27 15:05:30

+0

圣烟你说得对。我很困惑,为什么文档说你不能这样做,看起来你可以。 – powlo 2012-07-27 16:15:34

+0

FWIW,我用你的第一个模型实现(观察者是一个M2M)测试了我的代码,并且运行良好:) – 2012-07-27 16:39:09

1

的问题是,Django的通知使用通用外键。

所以我已经重新定义了我的观察家领域:

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

我还没有尝试出来呢?