如果不是null,Django返回属性,否则返回方法结果

时间:2015-06-16 15:47:11

标签: python django

我正在尝试使用方法装饰器创建一个动态属性,我遇到的问题是如果用户还没有保存他/她自己的话我想使用这个字段。例如:

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

有没有办法引用不动产或者其他方式来实现这一目标?

3 个答案:

答案 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)