Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django 2.1中创建模型后,将字段更新为主键值_Python_Django - Fatal编程技术网

Python 在Django 2.1中创建模型后,将字段更新为主键值

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,

我有一个名为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, related_name = 'parent',null=True)
这是我想要的功能:

  • 如果项目没有父项目,则该字段设置为 已创建对象主键

  • 如果项目没有根父项目,则该字段设置为 已创建对象的主键

理想情况下,我希望将字段的默认值设置为主键。 如果这是不可能的,那么我需要能够在生成主键并在Django中实例化模型之后更新该值

我已经研究过覆盖save方法或使用
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工作。我还需要强制执行其他条件,但我需要先让它工作起来,这样我至少可以创建一个初始项目。