gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:44:54 24 4
gpt4 key购买 nike

我有一个名为 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,因为这与将它们设置为可为空不同。

调用 super 构造函数将字段保存为空白。项目实例存在后,将字段更改为其自身。然后再次调用 super 构造函数来检测变化并保存模型。

关于python - 在 Django 2.1 中创建模型后将字段更新为主键值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52574349/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com