在models.py

时间:2015-05-26 12:58:10

标签: python django django-models

我想覆盖models.py中的类以在运行时获取调用堆栈。

我知道我们可以在Django中执行以下操作以覆盖管理器,从而自定义QuerySet 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类吗?这也没有成功。

1 个答案:

答案 0 :(得分:0)

您提到您了解如何覆盖模型的Manager。我无法想象在装饰器中覆盖管理器与作为属性的好处是什么。正如bruno desthuilliers在他的评论中提到的那样,Django在实例化时使用objects属性做了很多东西,装饰器可能无法工作。

以Django核心的方式执行此操作:https://docs.djangoproject.com/en/1.8/topics/db/managers/

否则就会增加技术债务而没有实际利益(至少据我所知)。如果通过Manager解决问题无法实现某些目标。