Django:字段的自我模型实例的默认值 [英] Django: field's default value from self model's instances

查看:159
本文介绍了Django:字段的自我模型实例的默认值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何为模型的现有对象取一个字段的默认值?



我尝试了这些,并没有起作用:



1)

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

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

NameError:name'self'未定义



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'未定义



3)

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

def get_previous():
返回ModelA.obje cts.all()[0] .fieldA

NameError:global name' get_previous'未定义



4)

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

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

NameError:全局名称ModelA没有定义



我很清楚为什么3)和4)不行。
我可以想象为什么1)不会工作 - 看起来像类'的属性不能引用实例(即自我)。
我可以想象为什么2)不会工作 - 显然没有参考模型A,直到解释器将通过整个课程。



那么我应该如何处理

解决方案

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



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



示例变为:

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

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

如果你打算这么做很多领域,那么考虑重写 save 函数,所以你只需要从数据库中获取上一个对象一次。 p>

How can I make default value for a field to be taken from existing objects of a model?

I tried these and it didn't worked:

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

I it's clear why 3) and 4) won't work. I can imagine why 1) won't work - looks like class' properies can't refer to instance's (i.e. self). I can imagine why 2) won't work - apparently there's no reference to ModelA until interpreter will go trough whole class.

So how should I approach this?

解决方案

In your examples, you need to remove the call operator ().

Currently the statement is executed immediately at the first read-parsing cycle. By specifying the symbol name instead, the Django class receives a function pointer which it will execute when it actually needs the default value.

The example becomes:

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

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

If you're going to do this for a lot of fields, consider overridding the save function, so you only have to fetch the previous object from the database just once.

这篇关于Django:字段的自我模型实例的默认值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆