首页 > 解决方案 > 如何设置指向自身的外键的默认值?

问题描述

模型.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()

标签: djangodjango-models

解决方案


您必须添加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',])

推荐阅读