Получить объект в отношениях «многие ко многим» в Django - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть две модели:

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

class Instrumentation(models.Model):
    instrument = models.ManyToManyField(Instrument, verbose_name=_('instrument'), related_name='instrumentation', blank=True)

Я хочу добавить метод сохранения в модель инструмента, где метод будет проверять, есть ли у инструмента уже объект, который имеет единственную связь с текущим инструментом. Если нет, я создам инструментальный объект с одним отношением к текущему инструменту. Если так, то ничего не происходит. Если в инструменте есть другой объект, имеющий отношение к скрипке, скрипке и виолончели. Это будет игнорироваться.

Например.

Я пытаюсь сохранить объект инструмента под названием «скрипка». Метод сохранения инструмента будет искать таблицу инструментов, чтобы увидеть, существует ли инструментальный объект, который содержит единственную связь со скрипкой. Если он не существует, то он создаст объект инструментария с отношением «скрипка».

У меня есть что-то вроде, но я не могу получить правильный фильтр:

В модель прибора:

def save(self, *args, **kwargs):
    try: 
        exists = Instrumentation.objects.filter(name=self.name)
    except:
        new = Instrumentation.objects.create(
            instrument=self.pk,
            name=self.name,)
        new.save()
    super().save(*args, **kwargs)

1 Ответ

0 голосов
/ 03 февраля 2020

Как упоминалось в комментариях и в документах , вы не можете добавлять записи через отношения M2M до того, как ваша целевая запись будет сохранена (получите назначенный PR). Если вам действительно нужно создать Instrumentation объекты с тем же именем, что и Instrument, и добавить этот объект в Instrument, если он все еще не существует, то вы можете go таким образом:

Я предполагаю, что вы все равно хотите сохранить Instument запись без метра, если Instrumentation существует или нет:

def save(self, *args, **kwargs):
    super().save(*args, **kwargs)

    if not Instrumentation.objects.filter(name=self.name).exists()
        instrumentation = Instrumentation.objects.create(name=self.name)
        self.instrumentation.add(instrumentation)
...