Py学习  »  Django

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

Ben • 5 年前 • 1535 次点击  

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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38943
 
1535 次点击  
文章 [ 1 ]  |  最新文章 5 年前
M.javid Uroš Trstenjak
Reply   •   1 楼
M.javid UroÅ¡ Trstenjak    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 因为它不同于将它们设置为可以为空。

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