Как добавить данные в модель поля 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 отделы. Правила просты: один отдел может иметь только один вышестоящий отдел и много дочерних.
Я хочу реализовать следующую логику:

Я создаю новый отдел 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)
Спасибо за ваши советы.