Как извлечь данные из набора запросов в django

я пытаюсь добавить ответ в раздел комментариев моего проекта блога вот models.py

class Comment(models.Model):
    blog= models.ForeignKey(Blog, on_delete=models.CASCADE,related_name='Blog_comment')
    user=models.ForeignKey(User,on_delete=models.CASCADE, related_name='user_comment')
    comment=models.TextField(default='Your Comment')
    parent =  models.ForeignKey('self', on_delete=models.CASCADE,null=True,related_name='paren_comment')
    comment_date=models.DateTimeField(auto_now_add=True)

вот ответы, которые я передал в шаблон через ключ replies

replies=Comment.objects.filter(blog=blog).exclude(parent=None)

его типом является

<class 'django.db.models.query.QuerySet'>
<
{% if comment.id == reply.parent.id %}
                                {{reply}}
                            {% endif %}

я просто хочу сравнивать по id родителя ответа; если они совпадают, то разрешить ответы под этим комментарием.

как я могу это сделать? должен ли я использовать какой-то пользовательский шаблон? (пожалуйста, спросите меня, если есть больше, чтобы объяснить эту проблему)

То, как вы сделали это выше, будет работать только для одного уровня. Вы не можете проверить наличие ответов в ответах. Для этого вам нужно рекурсивно применить обнаружение дочерних элементов, поскольку вы не знаете, сколько существует уровней ответов.

Одним из способов сделать это является предоставление средств для получения дочерних элементов комментария. Попробуйте добавить в вашу модель

следующий метод
class Comment(models.Model):
    ...
    def get_replies(self): 
    #we're using the parent 'related_name' get all the comments that are children of this one 
    #(maybe rename the related_name to 'children')
        return self.paren_comment.all() 

Далее мы получаем список всех первых комментариев (тех, у которых нет родителей) в файле views.py и передаем его нашему шаблону через контекст

#get a list of all first_comments for a blog
first_comments=Comment.objects.filter(blog=blog, parent=None)
context['comments'] = first_comments

Используйте базовый шаблон для начала работы, например, template.html

    {{blog.content}}
    {% for comment in comments %}
        <!-- we pass the comment presentation off to a sub-template -->
        <% include comment.html with comment = comment %>
     {% endfor %}

Затем каждый комментарий вызывает другой шаблон, который также может вызывать сам себя, если есть больше детей.

comment.html

    <!-- show the actual comment-->
    {{comment.comment}}

    <!-- next we use our model function to get any comment children-->
    {% for reply in comment.get_replies %}   
        <!-- we use blockquote here to provide a simple form of indentation -->
        <blockquote>        
            {% include 'comment.html' with comment=reply%}   
        </blockquote>
    {% endfor %}

Каждый уровень

Это должно работать (если предположить, что я не допустил ужасных опечаток), но вы можете обнаружить, что это немного медленно для большого количества комментариев, и django может возразить, если вы перейдете на слишком большое количество слоев. Для промышленных потоковых комментариев вы хотите использовать что-то вроде Django-mptt, который реализует Modified Preorder Tree Traversal и идеально подходит для комментариев, но немного более техничен в создании. Руководство по его использованию для потоковых комментариев можно найти здесь

вам нужно передать replies как контекст при рендеринге html

return render(
            request,
            "app_name/file_name.html",
            {"replies": replies},
        )

и затем в шаблоне итерация следующим образом

{% for reply in replies %}
     {{reply or reply.field_name_from_queryset }}
{% endfor %}

Вернуться на верх