Комментарии правильно назначены объектам ответа, но отображаются в одном объекте ответа
Я создаю платформу вопросов и ответов, чтобы помочь компаниям понять потребности своих клиентов. Как вы можете видеть в представлении 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)