Python 在Django 2.1中创建模型后,将字段更新为主键值
我有一个名为Project的Django模型,它本身具有递归外键Python 在Django 2.1中创建模型后,将字段更新为主键值,python,django,Python,Django,我有一个名为Project的Django模型,它本身具有递归外键 class Project(models.Model): project_root_parent = models.ForeignKey('self',on_delete=models.CASCADE, related_name='root_parent',null=True) project_parent = models.ForeignKey('self', on_delete=models.CASCADE,
class Project(models.Model):
project_root_parent = models.ForeignKey('self',on_delete=models.CASCADE, related_name='root_parent',null=True)
project_parent = models.ForeignKey('self', on_delete=models.CASCADE, related_name = 'parent',null=True)
这是我想要的功能:
- 如果项目没有父项目,则该字段设置为 已创建对象主键
- 如果项目没有根父项目,则该字段设置为 已创建对象的主键
post_save
信号,但我不确定这两种方法是否正确
class Project(models.Model):
project_root_parent = models.ForeignKey('self',on_delete=models.CASCADE, related_name='root_parent',null=True, blank=True)
project_parent = models.ForeignKey('self', on_delete=models.CASCADE, related_name = 'parent',null=True, blank=True)
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
if self.project_root_parent is None:
self.project_root_parent = self
if self.project_parent is None:
self.project_parent = self
super().save(*args, **kwargs)
诀窍是在创建CharFields
时确保blank=True
,因为这与将它们设置为null不同
调用超级构造函数将字段另存为空。
项目实例存在后,将字段更改为自身。
然后再次调用超级构造函数来检测更改并保存模型。每个递归都应该有一个结束,而你的递归不会有一个结束。“这背后更大的想法是什么?”KlausD。这种结构允许我在一个项目中有无限数量的子项目。你想要的功能会给你相反的结果:无限的祖先项目。它在SQL中工作。我手动测试了它。它应该在Django工作。我还需要强制执行其他条件,但我需要先让它工作起来,这样我至少可以创建一个初始项目。