Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django:field';s自模型的默认值';s实例_Django_Default_Field - Fatal编程技术网

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)