Django自关联ForeignKey能否设置自身实例为默认值?如何实现?
实现方案
第一步:调整模型字段属性
由于实例首次存入数据库前没有生成主键,外键无法直接关联到未持久化的实例,所以首先要给parent字段设置允许临时为空:
from django.db import models class Foo(models.Model): b = models.CharField(max_length=10) # 新增null=True、blank=True允许创建时临时为空 parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True)
第二步:重写save方法实现默认赋值
重写模型的save方法,在首次创建且用户未指定parent时自动关联自身:
class Foo(models.Model): b = models.CharField(max_length=10) parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True) def save(self, *args, **kwargs): is_first_create = self.pk is None # 先保存实例拿到主键 super().save(*args, **kwargs) # 首次创建且未指定parent时赋值为自身 if is_first_create and self.parent is None: self.parent = self # 强制走更新逻辑避免重复插入 super().save(force_insert=False, force_update=True)
注意事项
- 如果你使用
bulk_create批量创建实例,模型的save方法不会自动触发,需要你手动完成每个实例的parent赋值和二次更新 - 如果你需要保证数据库层面
parent最终不为空,可以额外添加数据库检查约束,过滤掉parent_id为空的记录
内容的提问来源于stack exchange,提问作者AminA2
相关产品推荐
相关产品推荐

