django - 如何设置指向自身的外键的默认值?
问题描述
模型.py
class Person(models.Model):
(...)
leader = models.ForeignKey("self", on_delete=models.RESTRICT, related_name ='leader_set')
当我创建对象时:
Person.objects.create()
leader 的值为 NULL,这是错误的。
我应该默认为同一个 Person 对象设置什么(在开始时 Person 是自己的领导者)
我知道,我可以添加 null=True,并在创建组领导后添加到新创建的对象,但想知道是否有更好的解决方案?
new_person = Person.objects.create()
new_person.leader = new_person
new_person.save()
解决方案
您必须添加blank=True
到该字段,因为在获得 ID 之前无法设置 FK 字段,并且在保存对象之前无法获得 ID,如您所见,您可以'当这个字段需要一个值时不要这样做。
然后,您可以在post_save
执行以下操作的方法中分配此值;
from django.db.models.signals import post_save
from django.dispatch import receiver
class Person(models.Model):
leader = models.ForeignKey(
"self",
blank=True
on_delete=models.RESTRICT,
related_name ='leader_set'
)
@receiver(post_save, sender=Person)
def auto_create_leader(instance, **kwargs):
"""
Anytime a Person object is created, associate the leader if it's not set
"""
if kwargs.get('created', False):
if not instance.leader:
instance.leader = instance
instance.save(update_fields=['leader',])
推荐阅读
- sql-server-2008 - xp_cmdshell 独立运行 7z,但找不到带参数的 EXE
- java - 在java中检查有效的括号
- javascript - 为什么我的 javascript 代码刷新但 PHP 不刷新?
- eclipse - 为什么 Spring Tool Suite 在每一行都显示错误?
- javascript - 在原生 JavaScript 中拖放
- email - "name" [1]: -- 缺失 -- 错误,在 hapi v17.4.0 中启动服务器时
- c# - 2 个单独的 INNER JOINRS 之间的 Linq-to-Sql LEFT OUTER JOIN
- mysql - MySQL - 将数据从行复制到另一个表?
- amazon-web-services - Glue 作业因 Amazon S3 超时而失败
- html - CSS - 父级的 Flexbox 子级高度(多列)