Как получить доступ ко многим-многим отношениям из разных родственных моделей? - PullRequest
0 голосов
/ 04 февраля 2020

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

class Instrument(MPTTModel):
    name = models.CharField(max_length=100, null=True, blank=True)

class Instrumentation(models.Model):
    name = models.CharField(max_length=100, null=True, blank=True)
    category = models.CharField(max_length=100, null=True, blank=True)
    instrument = models.ManyToManyField('Instrument', through='InstrumentMap')

class InstrumentMap(models.Model):
    instrumentation = models.ForeignKey(Instrumentation, verbose_name=_('instrumentation'), related_name='instrumentmap', null=True, blank=True, on_delete=models.PROTECT)
    instrument = models.ForeignKey(Instrument, verbose_name=_('instrument'), related_name='instrumentmap', null=True, blank=True, on_delete=models.PROTECT)
    numbers = models.IntegerField(null=True, blank=True)

class Work_Music(MPTTModel, Work):
    instrumentation = models.ForeignKey(Instrumentation, verbose_name=_('instrumentation'), related_name='work', null=True, blank=True, on_delete=models.PROTECT)
  1. Как мне получить доступ ко всем инструментам, находящимся под измерительным объектом, с работы?

Например:

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

Я пытался piece.instrumentation_set.all. Это не сработало?

Как вы получаете доступ от контрольно-измерительных приборов?

instrumentation = Instrumentation.objects.get(instrumentation__work=self.kwargs['pk'])

Я полагаю, вы делаете for l oop, когда вы можете захватить объект.

Как получить доступ из карты инструментов?

InstrumentMap = InstrumentMap.objects.filter(instrumentation__work=self.kwargs['pk']).order_by('order')

1 Ответ

2 голосов
/ 04 февраля 2020
  1. Инструментарий является внешним ключом, поэтому вы должны использовать:

    piece = Work_Music.objects.get(pk=self.kwargs['pk'])
    piece.instrumentation.instrumentmap.all() 
    
  2. Вы можете использовать обратное отношение many_to_one:

    instrumentation = Instrumentation.objects.get(work__id=self.kwargs['pk'])
    
  3. Вы можете получить доступ с помощью:

    instrument_maps = InstrumentMap.objects.filter(instrumentation__work__id=self.kwargs['pk'])
    
...