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

新手上路,请多包涵

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

我尝试了这些但没有用:

1)

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

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

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

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

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())

NameError: global name 'ModelA' is not defined

很明显为什么 3) 和 4) 不起作用。我可以想象为什么 1) 不起作用 - 看起来类的属性不能引用实例的(即自我)。我可以想象为什么 2) 不起作用 - 显然在解释器进入整个课堂之前没有对 ModelA 的引用。

那么我应该如何处理呢?

原文由 grucha 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 760
2 个回答

在您的示例中,您需要删除调用运算符 ()

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

示例变为:

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

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

如果您要为很多字段执行此操作,请考虑重写 save 函数,这样您只需从数据库中获取以前的对象一次。

原文由 vdboor 发布,翻译遵循 CC BY-SA 2.5 许可协议

选项 1: 使用模型表格。这些是基于模型的表单,您可以使用特定实例的值轻松填充它们的值。显然,如果您希望将默认值作为在表单中显示给用户的内容,则此选项很好。

选项 2: 覆盖模型的保存方法,并在那里编写检查代码 - 如果 fieldA 为 None,则在其中输入一些值。如果您希望默认值在数据层工作,而不只是作为表单默认值(即,也适用于您以其他方式创建的实例),则此选项更好。

原文由 Ofri Raviv 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题