我想覆盖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类吗?这也没有成功。
答案 0 :(得分:0)
您提到您了解如何覆盖模型的Manager
。我无法想象在装饰器中覆盖管理器与作为属性的好处是什么。正如bruno desthuilliers
在他的评论中提到的那样,Django在实例化时使用objects属性做了很多东西,装饰器可能无法工作。
以Django核心的方式执行此操作:https://docs.djangoproject.com/en/1.8/topics/db/managers/
否则就会增加技术债务而没有实际利益(至少据我所知)。如果通过Manager
解决问题无法实现某些目标。