2015-06-16 72 views
1

我試圖創建一個使用方法裝飾器的動態屬性,我遇到的問題是,我想要使用此字段,如果用戶沒有保存他/她只有自己。例如:Django的返回屬性,如果不爲空else返回方法的結果

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

有沒有辦法來指代不動產或者一些其他的方式來做到這一點?

回答

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()

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>}> 
1

有沒有,你不能使用default理由嗎?如果你想要比單個值更有趣的東西,你可以在裏面放一個可調用的對象。

從文檔:

def name_default(): 
    return "John" 

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

這將是一個偉大的想法......我需要訪問自我,並確定什麼是「約翰」是怎麼回事基於對象等領域是這樣。沒有提到這一點。反正+1;它會運作良好。 – mimoralea