Как вытащить связанные данные для контекста в шаблоне? - PullRequest
0 голосов
/ 24 января 2020

У меня есть следующие модели:

class Work_Music(MPTTModel):
    name = models.CharField(max_length=400, null=True, blank=True)
    key = models.CharField(max_length=10, null=True, blank=True)
    tonality = models.CharField(max_length=20, null=True, blank=True)
    tempo = models.CharField(max_length=500, null=True, blank=True)

    @property
    def is_opera(self):
        return hasattr(self, 'opera')

class Opera(models.Model):
    work = models.OneToOneField(Work_Music, verbose_name=_('work_music'), related_name='opera', on_delete=models.PROTECT)
    librettist = models.ForeignKey(Person, verbose_name=_('librettist'), null=True, blank=True, related_name='person', on_delete=models.PROTECT)

class OperaCast(models.Model):
    opera = models.ForeignKey(Opera, verbose_name=_('opera'), related_name='opera_cast', null=True, blank=True, on_delete=models.PROTECT)
    name = models.CharField(max_length=100, null=True, blank=True)

Мой view.py:

class Work_MusicView(TemplateView):
    template_name = 'composers/work_music/work.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        piece = Work_Music.objects.get(pk=self.kwargs['pk'])
        piece_tree = Work_Music.objects.get(pk=self.kwargs['pk']).get_family()

        opera = Opera.objects.get(work=self.kwargs['pk'])

    context.update({
        'piece': piece,
        'piece_tree': piece_tree,
        'opera': opera,
        'opera_cast': OperaCast.objects.filter(opera__work=self.kwargs['pk']).order_by('order'),
    })
    return context

Для всех произведений, опер или нет, я передаю объекты Work_Musi c шаблон для отображения ключа, имени, тональности и темпа произведения. Не каждая пьеса является оперой.

Если произведение является оперой, я хотел бы показать либреттиста Оперы, а также приведение оперы в контексте, связанном с этой пьесой, в структурированном виде. , Как ты это делаешь?

...