_set.all()在Django模板中不起作用,返回AttributeError



我正试图在Django项目中添加与帖子相关的评论数量。但由于某种原因,我一直收到'Post' object has no attribute 'comment_set'AttributeError,我不明白为什么。

我的项目有一个后模型

class Post(models.Model):
title = models.CharField(max_length=100, unique=True)
----------------------------------------
# To know how many comments
def num_comments(self):
return self.comment_set.all().count() <--------- Error from here
class Comment(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="commented_users")
post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name="commented_posts")
content = models.TextField(max_length=160)
updated = models.DateTimeField(auto_now=True)
created = models.DateTimeField(auto_now=True)

以下是视图.py

class UserOnlyPostListView(ListView):
model = Post
template_name = "score/user_only_posts.html"
context_object_name = 'posts'
paginate_by = 4
def get_queryset(self):
user = get_object_or_404(User, username=self.kwargs.get('username'))
return Post.objects.filter(designer=user).order_by('-date_posted')
def get_context_data(self, *args, **kwargs):
context = super(UserOnlyPostListView, self).get_context_data()
user = get_object_or_404(User, username=self.kwargs.get('username'))
return context

这是模板:

{% for post in posts %}
<td>{{ post.num_comments }}</td>
{% endfor %}

我的问题:为什么我收到这个错误,以及如何修复它?

谢谢

comment_set是django为获取指向Post的特定实例的所有注释而提供的默认related_name

但是,您已经设置了related_name="commented_posts",这意味着comment_set的默认值将被覆盖,您应该使用post.commented_posts而不是post.comment_set

注意:可能值得使用不同的相关名称,因为post.commented_posts有点令人困惑(因为它返回的是一组Comments而不是Posts(。comments的相关名称会更好。这样你就可以使用post.comments了。

而不是

return self.comment_set.all().count()

你必须使用

return self.commented_posts.all().count()

post = models.ForeignKey(Post, on_delete=models.CASCADE,
related_name="commented_posts")

如果删除related_name,则使用commentset。

最新更新