Передача объектов в подробный вид с фильтром (Django) - PullRequest
0 голосов
/ 24 ноября 2018

Я пытаюсь передать запрос комментариев (модель комментариев) в DetailView модели Post, используя фильтр, чтобы получить в DetailView только комментарии, относящиеся к конкретной публикации.

Модель сообщения:

class Post(models.Model):
    title = models.CharField(max_length=300)
    content = models.TextField()
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)

Модель комментария:

class Comment(models.Model):
    content = models.CharField(max_length=500, help_text='Не более 500 знаков')
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(on_delete=models.CASCADE)
    post_id = models.ForeignKey(on_delete=models.CASCADE)

Детализация veiw:

class PostDetailView(DetailView):
    context_object_name = 'post'
    model = Post

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['comments'] = Comment.objects.filter(post_id = self.model.id)
        return context

И он возвращает TypeError:

int() argument must be a string, a bytes-like object or a number, not 'DeferredAttribute'

Не могли бы вы помочь с рекомендацией относительно того, как правильноиспользовать фильтр, чтобы получать в DetailView только комментарии, относящиеся к этому посту?Спасибо!

1 Ответ

0 голосов
/ 24 ноября 2018

Ну, здесь ваш self.model вернет Post (ссылка на класс модели), а не объект post.

Вы можете получить доступ к объекту с помощью self.object, как указано в документация :

Во время выполнения этого представления self.object будет содержать объект , с которым работает представление.

class PostDetailView(DetailView):
    context_object_name = 'post'
    model = Post

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['comments'] = Comment.objects.filter(post_id=self.<b>object</b>)
        return context

Вы также можете использовать обратную связь, например:

class PostDetailView(DetailView):
    context_object_name = 'post'
    model = Post

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['comments'] = <b>self.object.comment_set.all()</b>
        return context

Примечание : обратите внимание, что поле ForeignKey обычно не заканчивается суффиксом _id, Django автоматически добавит дополнительное поле с именем fieldname_id, поэтому здесь у вас есть два поля, post_id и post_id_id, что довольно странно.

...