Невозможно выполнить запрос "Cast object (1)": должен быть экземпляр "Person" - PullRequest
0 голосов
/ 27 мая 2018

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

У меня проблемы с фильтрацией моего класса Cast , чтобы я мог получить конкретного актера.

Я не понимаю, почему фильтр не работает.Если self.object имеет значение «3», например, он должен отфильтровывать всех актеров и отображать только актера с идентификатором 3. Но это не так.Я также не понимаю код ошибки, который он выбрасывает.У моего класса «Каст» есть иностранный ключ к человеку.

По аналогии с моей страницей с подробностями шоу, вместо того, чтобы сниматься, я хочу, чтобы она была звездой актера в фильмах.

Изображение моегоПоказать детали страницы

Просмотр

class ActorDetailView(generic.DetailView):
    model = Cast
    template_name = 'show/actor-detail.html'

    def get_context_data(self, **kwargs):
        context = super(ActorDetailView, self).get_context_data(**kwargs)
        context['casts'] = Cast.objects.filter(person_id=self.object)

        return context

Модели

class Person(models.Model):
    name = models.CharField(max_length=128)

    def __str__(self):
        return self.name

class Character(models.Model):
    name = models.CharField(max_length=128)
    on_which_show = models.ForeignKey('Show', on_delete=models.SET_NULL, null=True)
    def __str__(self):
        return self.name

class Cast(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    cast_show = models.ForeignKey('Show',on_delete=models.CASCADE)
    character = models.ForeignKey(Character, on_delete=models.CASCADE, null=True)

    def get_absolute_url(self):
        return reverse('actor-detail', args=[str(self.id)])


class Show(models.Model):
        title = models.CharField(max_length=200)
        genre = models.ManyToManyField(Genre, help_text='Select a genre for this book')
        language = models.ForeignKey('Language', on_delete=models.SET_NULL, null=True)
        summary = models.TextField(max_length=1000, help_text='Enter a brief description of the show', null=True)
        cast_of_the_show = models.ManyToManyField(Person,through='Cast')

        def __str__(self):
            return self.title

        def get_absolute_url(self):
            return reverse('show-detail', args=[str(self.id)])

1 Ответ

0 голосов
/ 27 мая 2018

Модель для вашего ActorDetailView должна быть Person вместо Cast .Затем вы можете использовать личную запись для получения всех приведений, к которым они принадлежат.

class ActorDetailView(generic.DetailView):
    model = Person
    template_name = 'show/actor-detail.html'

    def get_context_data(self, **kwargs):
        context = super(ActorDetailView, self).get_context_data(**kwargs)
        context['casts'] = Cast.objects.filter(person=self.object)
        return context
...