django-notification:观察到的物品数量

时间:2012-07-27 11:51:05

标签: django django-queryset django-notification

我现在有一个查询集,它返回按照观看人数排序的模型中的数字项。所以我有一个代表这个链接的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类的所有对象的查询集,按照“观察”它们的人数排序?

2 个答案:

答案 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

我还没试过......