Как добавить данные в модель поля ManyToMany?

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

class Department(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=30)
    subsidiary = models.ManyToManyField('self',null=True,blank=True, symmetrical=False, related_name='subsidiary_name')
    superior = models.ForeignKey('self',null=True,blank=True, related_name='superior_name', on_delete = models.DO_NOTHING)
    manager = models.ForeignKey(Manager, on_delete = models.DO_NOTHING)
    history = HistoricalRecords()

def get_subsidiary(self):
        return "\n".join([p.title for p in self.subsidiary.all()])

def __str__(self):
    return self.title 

В модели Department у меня есть 2 экземпляра одной и той же модели: subsidiary и superior отделы. Правила просты: один отдел может иметь только один вышестоящий отдел и много дочерних. Я хочу реализовать следующую логику: enter image description here

Я создаю новый отдел SLF, и, например, выбираю отдел SID в качестве вышестоящего отдела для SLF. Наконец, когда я сохраняю объект SLF, я хочу автоматически добавить этот отдел как дочерний для SID.

Я пытаюсь переопределить метод сохранения следующим образом:

def save(self, *args, **kwargs):
    print('Department.objects.filter(title=self.superior): ', Department.objects.filter(title=self.superior))
    if self.superior__in == Department.objects.filter(title=self.superior.title):
        tmp = Department.objects.filter(title=self.superior.title)
        tmp.create(subsidiary = self.superior)
        tmp.save()

    super(Department, self).save(*args, **kwargs)
<

Для добавления нового объекта в add() необходимо использовать функцию ManyToManyField. Помните также, что при filter вы получаете QuerySet. Чтобы получить объект, вам нужно get или даже get_object_or_404, но это уже смотрите сами :)

...
    tmp = Department.objects.get(title=self.superior.title)
    tmp.subsidiary.add(self.superior)
...

Вам не нужно сохранять его.

Наконец-то,

def save(self, *args, **kwargs):
        super(Department, self).save(*args, **kwargs)
        if self.superior == Department.objects.get(title=self.superior.title):
            tmp = Department.objects.get(title=self.superior.title)
            tmp.subsidiary.add(self)

Спасибо за ваши советы.

Вернуться на верх