2015-05-26 17 views
1

我想覆蓋models.py中的類以在運行時獲取調用堆棧。覆蓋模型Django之外的models.py中的.objects

我知道我們可以做到在Django以下,以覆蓋經理,因此定製查詢集API -

所以,在models.py

class A(models.Model): 
     objects = SomeClass() 

SomeClass

class B(Manager): 
    def get_query_set(): 
    # override the way you want 

但,爲了使事情更簡單,我正在考慮使用裝飾器來覆蓋相同 - 因此, 在models.py

@ decoratorForOverriding class A(models.Model): pass

decorator.py

def decoratorForOverriding(cls): 
cls.objects = SomeClass() 

錯誤,我得到

AttributeError: 'NoneType' object has no attribute '_meta' 

任何想法是怎麼回事? 我應該讓class A成爲一個abstarct類嗎?這也沒有辦法。

+0

你想達到什麼目的? – Wtower

+2

裝飾者必須返回一些東西。在這裏它應該返回修改的類。 –

+2

另外要注意的是,在Django模型類中有相當多的balck魔術發生(比如'django.models.base.ModelBase',特別是'__new __()'方法),所以你的天真解決方案很可能不會工作。 –

回答

0

您提到您知道如何覆蓋模型的Manager。我很難想象在裝飾者中作爲財產重寫經理的好處。正如bruno desthuilliers在他的評論中提到的,Django在實例化中使用objects屬性做了一堆事情,裝飾器可能無法工作。

這樣做的方法Django的核心意圖:https://docs.djangoproject.com/en/1.8/topics/db/managers/

這樣做,否則會增加技術債務沒有真正的好處(至少據我可以告訴)。如果有什麼不能通過Manager來實現,那麼我們可以解決這個問題。

+0

Francis Yaconiello,有一個巨大的現有Django應用程序,我想''models.py'中獲得調用堆棧的類,我可能不想記錄所有類的調用堆棧,可能會有一些。所以在現有的代碼中,爲了簡化這個所謂的「元任務」,我想到了使用裝飾器,這反過來會幫助我通過不干擾現有的代碼。我的用例是 - 爲了獲得所需類的調用堆棧在運行時django應用程序。因此,使用裝飾器來完成這樣的任務是不可取的? – malhar