#python #django
#python #django
Вопрос:
Я пытаюсь добавить количество комментариев, связанных с сообщением в моем проекте Django. но я продолжаю получать 'Post' object has no attribute 'comment_set'
ошибку атрибута по какой-то причине, я не понимаю, почему.
В моем проекте есть модель Post
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)
Вот views.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 %}
Мой вопрос:
Почему я получаю эту ошибку и как ее исправить?
Спасибо
Ответ №1:
comment_set
по умолчанию related_name
django предоставляет для получения всех комментариев, которые указывают на этот конкретный экземпляр Post
.
Однако вы установили related_name="commented_posts"
, что означает, что значение по умолчанию comment_set
перезаписано, и вы должны использовать post.commented_posts
вместо post.comment_set
.
Примечание: возможно, стоит использовать другое связанное имя, поскольку post.commented_posts
это немного сбивает с толку (поскольку оно возвращает набор комментариев, а не сообщений). Связанное имя было comments
бы лучше. Таким образом, вы бы использовали post.comments
.
Ответ №2:
вместо
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, вы перейдете к comment_set .