【问题标题】:django-notification: How many observed itemsdjango-notification:有多少观察到的项目
【发布时间】:2012-07-26 02:20:20
【问题描述】:

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

【问题讨论】:

    标签: django django-queryset django-notification


    【解决方案1】:

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

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

    【讨论】:

    • 你说得对,我认为注释应该发生在 MyModel 上,而不是编辑答案。
    • 天哪,你是对的。我很困惑为什么文档说你不能这样做,而看起来你可以。
    • FWIW,我用你的第一个模型实现(观察者是 M2M)测试了我的代码并且运行良好:)
    • 是的,我让它与标准 m2m 一起工作,但那是在过渡到 django-notification 之前。
    • 啊,不知道你删除了m2m。在这种情况下,我猜你有两个选择:带回 m2m 并将信号处理程序附加到“观察”,将用户实例添加到它,或者尝试 django-generic-aggregation。
    【解决方案2】:

    问题在于 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

    我还没试过……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多