Невозможно запросить "Продукт": Должен быть экземпляр "Комментарий"

Я пытаюсь добавить систему комментирования и ответов к модели моих продуктов, но не могу добавить ответы на комментарии. Это делается на той же странице, где пользователю показываются детали продукта.

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')
Вернуться на верх