2015-05-26 21 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