代码之家  ›  专栏  ›  技术社区  ›  Ben

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

  •  1
  • Ben  · 技术社区  · 6 年前

    我有一个名为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 但我不确定这些方法是否正确。

    1 回复  |  直到 6 年前
        1
  •  0
  •   M.javid munsu    6 年前
    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)
    

    诀窍是确保 blank=True 当创建 CharFields 因为它不同于将它们设置为可以为空。

    调用超级构造函数将字段保存为空。 一旦项目实例存在,则将字段更改为其自身。 然后再次调用超级构造函数以检测更改并保存模型。