Django:字段自身模型实例的默认值

gru*_*cha 19 django default field

如何为从模型的现有对象中获取的字段设置默认值?

我尝试过这些并没有奏效:

1)

class ModelA(models.Model):
    fieldA = models.CharField(default=self.get_previous())

    def get_previous(self):
        return ModelA.objects.all()[0].fieldA
Run Code Online (Sandbox Code Playgroud)

NameError: name 'self' is not defined

2)

class ModelA(models.Model):
    fieldA = models.CharField(default=ModelA.get_previous())

    @staticmethod
    def get_previous():
        return ModelA.objects.all()[0].fieldA
Run Code Online (Sandbox Code Playgroud)

NameError: name 'ModelA' is not defined

3)

class ModelA(models.Model):
    fieldA = models.CharField(default=get_previous())

def get_previous():
    return ModelA.objects.all()[0].fieldA
Run Code Online (Sandbox Code Playgroud)

NameError: global name 'get_previous' is not defined

4)

def get_previous():
    return ModelA.objects.all()[0].fieldA

class ModelA(models.Model):
    fieldA = models.CharField(default=get_previous())
Run Code Online (Sandbox Code Playgroud)

NameError: global name 'ModelA' is not defined

我很清楚为什么3)和4)不起作用.我可以想象为什么1)不会起作用 - 看起来类'本能不能引用实例(即自我).我可以想象为什么2)不起作用 - 显然没有对ModelA的引用,直到解释器将通过全班.

那我该怎么做呢?

vdb*_*oor 16

在您的示例中,您需要删除呼叫运算符().

目前,语句在第一个读取解析周期立即执行.通过指定符号名称,Django类接收一个函数指针,它将在实际需要默认值时执行.

该示例变为:

def get_previous():
    return ModelA.objects.all()[0].fieldA

class ModelA(models.Model):
    fieldA = models.CharField(default=get_previous)
Run Code Online (Sandbox Code Playgroud)

如果要对很多字段执行此操作,请考虑重写该save函数,因此您只需从数据库中获取一次上一个对象.

  • 请注意,默认使用 lambda 函数会扰乱迁移,因为 lambda 函数无法序列化。 (2认同)