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
Python Django返回属性if not null else返回方法结果_Python_Django - Fatal编程技术网

Python Django返回属性if not null else返回方法结果

Python Django返回属性if not null else返回方法结果,python,django,Python,Django,我试图使用decorator方法创建一个动态属性,我遇到的问题是,如果用户没有只保存他/她自己的字段,我想使用这个字段。例如: class Person(models.Model): name = models.CharField(max_length=100, null=True, blank=True) def __str__(self): return self.name @property def name(self):

我试图使用decorator方法创建一个动态属性,我遇到的问题是,如果用户没有只保存他/她自己的字段,我想使用这个字段。例如:

class Person(models.Model):
    name = models.CharField(max_length=100, null=True, blank=True)

    def __str__(self):
        return self.name

    @property
    def name(self):
        return self.name if self.name else "John"
基本上,如果在name字段中找不到任何内容,我希望返回“John”。但是,这样做,Django会抱怨,因为
self.name
查看的是name函数,而不是实际的属性

调用Python对象时超出了最大递归深度


有没有办法提及不动产或其他方式来实现这一点

一种简单的方法是重命名访问器方法/属性:

class Person(models.Model):
    name = models.CharField(max_length=100, null=True, blank=True)

    def __str__(self):
        return self.name

    def get_name(self):
        return self.name if self.name else "John"
In [8]:   1 class A(object):
          2     name = 0
          3     @property
          4     def name():
          5         return self.name or 5

In [9]: A.__dict__
Out[9]: 
<dictproxy {'__dict__': <attribute '__dict__' of 'A' objects>,
 '__doc__': None,
 '__module__': '__main__',
 '__weakref__': <attribute '__weakref__' of 'A' objects>,
 'name': <property at 0x7f50832736d8>}>
然后,当您有一个实例时:


person.get_name()

一种简单的方法是重命名访问器方法/属性:

class Person(models.Model):
    name = models.CharField(max_length=100, null=True, blank=True)

    def __str__(self):
        return self.name

    def get_name(self):
        return self.name if self.name else "John"
In [8]:   1 class A(object):
          2     name = 0
          3     @property
          4     def name():
          5         return self.name or 5

In [9]: A.__dict__
Out[9]: 
<dictproxy {'__dict__': <attribute '__dict__' of 'A' objects>,
 '__doc__': None,
 '__module__': '__main__',
 '__weakref__': <attribute '__weakref__' of 'A' objects>,
 'name': <property at 0x7f50832736d8>}>
然后,当您有一个实例时:


person.get_name()

您不应该在单个命名空间中重复名称。您可以将字段从
名称
重命名为
\u name
,因为您不打算公开它,也不打算给属性另起一个名称

实际上,我找不到任何方法来获取初始属性
name
。它似乎完全被属性覆盖:

In [8]:   1 class A(object):
          2     name = 0
          3     @property
          4     def name():
          5         return self.name or 5

In [9]: A.__dict__
Out[9]: 
<dictproxy {'__dict__': <attribute '__dict__' of 'A' objects>,
 '__doc__': None,
 '__module__': '__main__',
 '__weakref__': <attribute '__weakref__' of 'A' objects>,
 'name': <property at 0x7f50832736d8>}>
[8]中的
:1 A类(对象):
2名称=0
3@property
4定义名称():
5返回self.name或5
在[9]中:一句话__
出[9]:

您不应该在单个命名空间中重复名称。您可以将字段从
名称
重命名为
\u name
,因为您不打算公开它,也不打算给属性另起一个名称

实际上,我找不到任何方法来获取初始属性
name
。它似乎完全被属性覆盖:

In [8]:   1 class A(object):
          2     name = 0
          3     @property
          4     def name():
          5         return self.name or 5

In [9]: A.__dict__
Out[9]: 
<dictproxy {'__dict__': <attribute '__dict__' of 'A' objects>,
 '__doc__': None,
 '__module__': '__main__',
 '__weakref__': <attribute '__weakref__' of 'A' objects>,
 'name': <property at 0x7f50832736d8>}>
[8]中的
:1 A类(对象):
2名称=0
3@property
4定义名称():
5返回self.name或5
在[9]中:一句话__
出[9]:

有什么原因不能使用密码吗?如果你想要比单个值更有趣的东西,你可以在里面放一个callable

从文档中:

def name_default():
    return "John"

name = models.CharField(max_length=100, default=name_default)

有什么理由不能使用a吗?如果你想要比单个值更有趣的东西,你可以在里面放一个callable

从文档中:

def name_default():
    return "John"

name = models.CharField(max_length=100, default=name_default)

这将是一个好主意。。。我需要访问self并根据对象中的其他字段确定“John”是什么样子。没有提到那件事+1无论如何;这会很好的。这将是一个好主意。。。我需要访问self并根据对象中的其他字段确定“John”是什么样子。没有提到那件事+1无论如何;这会很有效的。