如何将数据添加到 ManyToMany 字段模型?

How to add data to a ManyToMany field model?

我有型号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 个相同模型的实例:subsidiarysuperior 部门。规则很简单:一个部门只能有一个上级部门,下属有多个部门。 我想实现下一个逻辑:

我正在创建新部门 SLF,并且 f.e。我选择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)

感谢您的指点。