У меня есть следующие модели:
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 шаблон для отображения ключа, имени, тональности и темпа произведения. Не каждая пьеса является оперой.
Если произведение является оперой, я хотел бы показать либреттиста Оперы, а также приведение оперы в контексте, связанном с этой пьесой, в структурированном виде. , Как ты это делаешь?