如何将数据添加到 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 个相同模型的实例:subsidiary
和 superior
部门。规则很简单:一个部门只能有一个上级部门,下属有多个部门。
我想实现下一个逻辑:
我正在创建新部门 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)
感谢您的指点。
我有型号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,并且 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)
感谢您的指点。