1

我现在有一个查询集,它返回模型中按观看人数排序的项目数。所以我有一个代表这个链接的 m2m 字段。

IE:

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

4

2 回答 2

1

您可以通过使用注释来实现:

from django.db.models import Count
MyModel.objects.annotate(num_users=Count('watchers')).order_by('num_users')
于 2012-07-27T13:08:26.577 回答
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 无法做到的。

Django 的数据库聚合 API 不适用于 GenericRelation。

不用担心,我认为这可能会有所帮助:

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

回购在这里:

https://github.com/coleifer/django-generic-aggregation

我还没试过。。。

于 2012-07-27T15:23:25.557 回答