我正试图在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。