1

我正在使用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 }}使用模板上的Managed to get 工作。对那个解决方案不太满意,尤其是在 ListView 中。感觉超级未优化。

4

1 回答 1

0

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

于 2020-11-19T20:12:45.017 回答