【问题标题】:django-activity-stream with aggregation带有聚合的 django-activity-stream
【发布时间】:2021-02-24 23:13:53
【问题描述】:

我正在使用django-activity-stream 创建目标提要。 Goal 对象的简化版本如下:

class Goal(models.Model):
    user = models.ForeignKey(User, related_name="goals", on_delete=models.CASCADE)
    liked_by = models.ManyToManyField(User, related_name="goals_cheered")
    title = models.CharField(_("title"), max_length=80)

有 2 项操作:目标应在创建后和完成后出现在提要中。然后用户可以喜欢这个目标,这就是我遇到的问题:在提要中添加“喜欢”计数。

这是迄今为止对我来说最有意义的(失败的)尝试:

from django.db.models import Prefetch

goal_qs = Goal.objects.annotate(likes=Count("liked_by"))
prefetch = [Prefetch("action_object", queryset=goal_qs)]

# in a `group` feed:
qs = group.target_actions.all().prefetch_related("actor__profile").prefetch_related(*prefetch)

这给了我一个ValueError:“自定义查询集不能用于此查找。” 也许是因为 django-activity-stream 使用了 GFK?

我如何获得喜欢的次数?我可以以某种方式限制 content_type 吗?

更新

通过在模板上使用{{ goal.liked_by.all|length }} 来获得工作。对那个解决方案不太满意,尤其是在 ListView 中。感觉超级未优化。

【问题讨论】:

  • 更多关于什么是grouptarget_actions 以及它与Goal 的关系可能有助于提供更好的解决方案。

标签: django django-activity-stream


【解决方案1】:

这确实是次优的。但是使用通用外键恐怕你不能做得更好。但是,{{ goal.liked_by.count }} 仍然比{{ goal.liked_by.all|length }} 高效得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    相关资源
    最近更新 更多