Python Django返回属性if not null else返回方法结果
我试图使用decorator方法创建一个动态属性,我遇到的问题是,如果用户没有只保存他/她自己的字段,我想使用这个字段。例如: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):
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无论如何;这会很有效的。