Комментарии правильно назначены объектам ответа, но отображаются в одном объекте ответа

Я создаю платформу вопросов и ответов, чтобы помочь компаниям понять потребности своих клиентов. Как вы можете видеть в представлении view_question, я отображаю ответ, основанный на вопросе, и он отлично работает. Однако при отображении комментариев к ответу с помощью этого метода:

answers = Answer.objects.filter(post=question)
answers_comment = CommentA.objects.filter(post=answers)

Этот метод возвращает ошибку в шаблоне: The QuerySet value for an exact lookup must be limited to one result using slicing. затем я пытаюсь отобразить его с помощью этого метода:

answers = Answer.objects.filter(post=question)
answers_comment = CommentA.objects.filter(post__id__in=answers)

Кажется, что проблема решена, но это не так. answers_comment отображает все объекты комментариев к одному объекту ответа, даже если они не были назначены этому ответу.

{% for answer in answers %}
        <div class="row border-bottom">
            <div class="col col-answer">
                <div class="answer-icons">
                    <a style="text-decoration: none;" href="">
                        <span><i class="fas fa-arrow-up"></i></span>
                        <span>{{ answer.up_vote }}</span>
                    </a>
    
                    <a style="text-decoration: none;" href="">
                        <span><i class="fas fa-arrow-down"></i></span>
                        <span>{{ answer.down_vote }}</span>
                    </a>
                </div>
                <div class="answer-text">
                    <p>{{answer.your_answer|convert_markdown|safe}}</p>
                </div>
            </div>
        </div>
        {% endfor %}



        <div class="comment-container m-2">
            {% for answer_comment in answers_comment %}
            <div class="row">
                <small>{{ answer_comment.comment }}</small>
                {% with answer_comment.user.account as account %}
                <a style="text-decoration: none;" class="user-avatar" href="{% url 'Public-Profile' slug=account.slug %}">
                    <span>{{ answer_comment.user.username }}
                    </span>
                </a>
                <small>{{ answer_comment.created_at|naturaltime }}</small>
                <hr>
                {% endwith %}
            </div>
            {% endfor %}
def view_question(request, slug):
    question = get_object_or_404(Question, slug=slug)
    answers = Answer.objects.filter(post=question)
    answers_comment = CommentA.objects.filter(post__id__in=answers)
    context = {"question":question, "answers":answers, "answers_comment":answers_comment}
    return render(request, 'view_question.html', context)

модели:

class Question(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    title = models.CharField(max_length=225)
    body = models.TextField()

class Answer(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    your_answer = models.TextField()
    post = models.ForeignKey(Question, on_delete=models.CASCADE)

class CommentA(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    comment = models.TextField()
    post = models.ForeignKey(Answer, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)

Попробуйте сделать следующее в своем представлении

 answers_id = [a.id for a in answers]
 answers_comment = CommentA.objects.filter(post_id__in=answers)

Это не приведет к объединению, так как post_id уже находится в CommentA модели.

Примечание: проблема в том, что вы отправляете все комментарии, не зная, к какому ответу они относятся, что значительно усложнит код шаблона.

Решением является использование обратного поиска отношений, предоставляемого django, следующим образом

for answer in answers:
    for comment in answer.commentA_set.all():
         .....

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

{% for answer in answers %}
    <div class="row border-bottom">
        <div class="col col-answer">
            <div class="answer-icons">
                <a style="text-decoration: none;" href="">
                    <span><i class="fas fa-arrow-up"></i></span>
                    <span>{{ answer.up_vote }}</span>
                </a>
                <a style="text-decoration: none;" href="">
                    <span><i class="fas fa-arrow-down"></i></span>
                    <span>{{ answer.down_vote }}</span>
                </a>
            </div>
            <div class="answer-text">
                <p>{{ answer.your_answer|convert_markdown|safe }}</p>
            </div>
        </div>
    </div>

    <!-- Retrieve comments for this answer -->
    {% for comment in answer.comments.all %}
        <div class="comment-container m-2">
            <div class="row">
                <small>{{ comment.comment }}</small>
                <a style="text-decoration: none;" class="user-avatar" href="{% url 'Public-Profile' slug=comment.user.account.slug %}">
                    <span>{{ comment.user.username }}</span>
                </a>
                <small>{{ comment.created_at|naturaltime }}</small>
                <hr>
            </div>
        </div>
    {% endfor %}
{% endfor %}

В моих моделях CommentA я должен определить related_name для ForeignKey из CommentA, чтобы упростить обратный поиск.

class CommentA(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    comment = models.TextField()
    post = models.ForeignKey(Answer, on_delete=models.CASCADE, related_name='comments')
    created_at = models.DateTimeField(auto_now_add=True)
Вернуться на верх