Django:field';s自模型的默认值';s实例
如何为要从模型的现有对象获取的字段设置默认值 我试过这些,但都不起作用: (一)Django:field';s自模型的默认值';s实例,django,default,field,Django,Default,Field,如何为要从模型的现有对象获取的字段设置默认值 我试过这些,但都不起作用: (一) name错误:未定义名称“self” (二) name错误:未定义名称“ModelA” (三) name错误:未定义全局名称“get\u previous” (四) name错误:未定义全局名称“ModelA” 我很清楚为什么3)和4)不起作用。 我可以想象为什么1)不起作用——看起来类的属性不能引用实例的属性(即self)。 我可以想象为什么2)不起作用——显然,在解释器在整个课堂上使用之前,并没有对ModelA
name错误:未定义名称“self”
(二)
name错误:未定义名称“ModelA”
(三)
name错误:未定义全局名称“get\u previous”
(四)
name错误:未定义全局名称“ModelA”
我很清楚为什么3)和4)不起作用。
我可以想象为什么1)不起作用——看起来类的属性不能引用实例的属性(即self)。
我可以想象为什么2)不起作用——显然,在解释器在整个课堂上使用之前,并没有对ModelA的引用
那么我应该如何处理这个问题呢?如果您只想输出默认值,请像下面这样重写
\uuu getattr\uuuu()
方法:
class ModelA(models.Model):
# your fields
def __getattr__(self, name):
if(name == 'fieldA' and !self.fieldA):
return self.get_previous()
else:
return super(ModelA, self).__getattr__(name)
从对象中保存默认值将比较困难。我想到的第一个解决方案(我相信有更简单的解决方案)选项1:。这些表单基于模型,您可以使用特定实例中的值轻松填充它们的值。显然,如果您希望在表单中向用户显示默认值,那么这个选项很好
选项2:,并在此处对复选框进行编码-如果fieldA为None,则在其中输入一些值。如果您希望默认值在数据层工作,并且不仅作为表单默认值(即,也用于以其他方式创建的实例),则此选项更好。在示例中,您需要删除呼叫操作符
()
当前,该语句在第一个读取解析周期立即执行。通过指定符号名,Django类接收一个函数指针,它将在实际需要默认值时执行该指针
例如:
def get_previous():
return ModelA.objects.all()[0].fieldA
class ModelA(models.Model):
fieldA = models.CharField(default=get_previous)
如果要在很多字段中这样做,请考虑重写<代码>保存< /C>函数,因此只需要从数据库中取出以前的对象一次。
好点!在我的例子中,虽然我有很多字段要获取默认值,但是我需要为每个字段分别使用不同的函数。(但我会考虑使用lambda来概括这一点,比如代码< lambda:GETYORADION('FieldIONNEX)),您应该能够做到<代码>默认= lambda:MODEA.Objist.AL()(0)。.fieldA。请注意,使用lambda函数作为默认值会干扰迁移,因为lambda函数无法序列化。我的目的是向用户显示默认值,而不是在没有值的情况下保存默认值,因此答案中的选项_1看起来不错。虽然我更喜欢vdboor的答案,因为它是python级别的,不太适合django。Djangonauts,如果我走错了,请纠正我;-)class ModelA(models.Model):
fieldA = models.CharField(default=get_previous())
def get_previous():
return ModelA.objects.all()[0].fieldA
def get_previous():
return ModelA.objects.all()[0].fieldA
class ModelA(models.Model):
fieldA = models.CharField(default=get_previous())
class ModelA(models.Model):
# your fields
def __getattr__(self, name):
if(name == 'fieldA' and !self.fieldA):
return self.get_previous()
else:
return super(ModelA, self).__getattr__(name)
def get_previous():
return ModelA.objects.all()[0].fieldA
class ModelA(models.Model):
fieldA = models.CharField(default=get_previous)