Невозможно запросить "Продукт": Должен быть экземпляр "Комментарий"
Я пытаюсь добавить систему комментирования и ответов к модели моих продуктов, но не могу добавить ответы на комментарии. Это делается на той же странице, где пользователю показываются детали продукта.
views.py:
class ProductFeedbackView(DetailView):
model = Product
template_name = 'store/product_feedback.html'
def get_context_data(self , **kwargs):
data = super().get_context_data(**kwargs)
connected_comments = Comment.objects.filter(product=self.get_object())
number_of_comments = connected_comments.count()
data['comments'] = connected_comments
data['no_of_comments'] = number_of_comments
data['comment_form'] = CommentForm()
connected_replies = Reply.objects.filter(comment=self.get_object())
number_of_replies = connected_replies.count()
data['replies'] = connected_replies
data['no_of_replies'] = number_of_replies
data['reply_form'] = ReplyForm()
return data
models.py:
class Product(models.Model):
author = models.ForeignKey(User, default=None, on_delete=models.CASCADE)
title = models.CharField(max_length=120, unique=True)
description = models.CharField(max_length=300, blank=True, null=True)
class Comment(models.Model):
product = models.ForeignKey(Product, on_delete=models.CASCADE, blank=True, null=True, related_name='comments')
author = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True,)
content = models.CharField(max_length=200, null=True, blank=False)
class Reply(models.Model):
comment = models.ForeignKey(Comment, on_delete=models.CASCADE)
author = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True,)
content = models.TextField(null=True, blank=False)
Как следует из сообщения об ошибке, вы пытаетесь присвоить экземпляр Product полю, которое ожидает экземпляр Comment.
Вот строка, в которой вы пытаетесь сделать это:
connected_replies = Reply.objects.filter(comment=self.get_object())
self.get_object()
возвращает экземпляр Product, как вы определили model = Product
на вашем View.
Чтобы получить ответы, связанные с вашим продуктом, вам нужно будет перебрать все комментарии и для каждого комментария все его ответы, поскольку вы определили эти отношения как foreignkeys.
Например:
for comment in connected_comments:
comment_replies = Reply.objects.filter(comment=comment)
@Vincent Ответ в порядке, ошибка связана с неправильной моделью, переданной в фильтр модели Replay.
Но для облегчения отображения комментариев и ответов на них в шаблоне я предлагаю удалить из контекста
data['replies']
data['no_of_replies']
и в шаблоне, где вы перебираете комментарии (просто пример):
{% for comment in comments %}
<h1>{{comment}}</h1>
{% for reply in comment.reply_set.all %}
<p>{{ reply }} </p>
{% endfor %}
{% endfor %}
используйте обратную связь с reply_set.
О, и для оптимизации добавьте prefetch_related
к вашему запросу:
Comment.objects.filter(product=self.get_object()).prefetch_related('reply_set')