_set.all() не работает в шаблоне Django, возвращая ошибку атрибута

#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 .