2009-12-09 72 views
2

在Django中,我需要創建一個模型,其中該模型的一個實例可以從該模型的另一個實例繼承值,該值等於超類 - 子類型關係。我在這個模型中創建了一個名爲parent的字段,它是一個可選的自引用外鍵。那麼我想重寫__getattribute__方法如下:在Django中覆蓋Model類的__getattribute__

def __getattribute__(self, name): 
    if models.Model.__getattribute__(self, 'parent') is None: 
     return models.Model.__getattribute__(self, name) 
    elif models.Model.__getattribute__(self, name) is not None: 
     return models.Model.__getattribute__(self, name) 
    else: 
     return parent.__getattribute__(name) 

此代碼會導致無限遞歸,因爲模型類的__get__方法調用內置的方法在實例GETATTR傳遞作爲第一個參數。

有沒有另一種方法可以完成我想要做的事情?

回答

2

做這種方式時,這是充滿了困難。

請重新考慮覆蓋__getattribute__並使用普通的舊屬性。

我懷疑帶有屬性名稱的簡單「getter」會做任何你想要的東西而不會碰到任何魔法。

是的,你可能有幾個類似的字段,但我認爲簡單明顯的屬性更適合Django ORM。

+0

很公平。我懷疑是這樣。謝謝你的幫助。 – 2009-12-10 04:30:54

1

你需要那個父母的屬性會影響自己的屬性嗎?如果沒有,你最好覆蓋__getattr__()代替__getattribute__()當實例本身屬性這個名字這不叫:

def __getattr__(self, name): 
    return getattr(self.parent, name) 
0

我想覆蓋__getattribute____getattr__可能會導致性能成本。有可能是一個更好的辦法來解決這個問題:

  1. 在模型實例初始化,如果可繼承字段爲空和相應的父母的字段不是,做setattr(self, field_name, getattr(self.parent, field_name))
  2. 跟蹤模型實例字段的更改。
  3. 在保存實例之前,請設置先前被覆蓋但未更改爲None的字段。

我正在開發一個Django應用程序爲:https://github.com/Altaisoft/django-inheritance