我正在尝试使用方法装饰器创建一个动态属性,我遇到的问题是如果用户还没有保存他/她自己的话我想使用这个字段。例如:
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"
基本上,如果我在名称字段中找不到任何内容,我想返回“John”。但是,这样做,Django抱怨,因为self.name
正在调查名称函数而不是实际属性。
maximum recursion depth exceeded while calling a Python object
有没有办法引用不动产或者其他方式来实现这一目标?
答案 0 :(得分:2)
执行此操作的一种简单方法是重命名您的访问者方法/属性:
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"
然后当你有一个实例时:
person.get_name()
答案 1 :(得分:2)
您不应在单个命名空间中复制名称。您可以将字段从name
重命名为_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>}>
答案 2 :(得分:1)
是否有理由不能使用default?如果你想要比单个值更有趣的东西,你可以在那里放一个callable。
来自文档:
def name_default():
return "John"
name = models.CharField(max_length=100, default=name_default)