我在返回由观看它的人数排序的模型中返回数字项的QuerySet。所以我有一个表示此链接的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')
.

这很好。

现在,如何生成代表Class MyModel类的所有对象的查询集,由人们观察它们的人数命令?

有帮助吗?

解决方案

您可以使用注释完成:

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

其他提示

问题是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不适用于泛曲线。

不担心,我认为这可能有助于:

http://charlesleifer.com/blog/generation-aggregate -data-inferic-actions /

repo在这里:

https://github.com/coleifer/django-generic-aggregation < / p>

我还没有尝试过...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top