【发布时间】:2015-05-26 12:58:09
【问题描述】:
我想覆盖 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 作为抽象类吗?那也没有用。
【问题讨论】:
-
你想达到什么目的?
-
装饰器必须返回一些东西。在这里它应该返回修改后的类。
-
还要注意,在 django 模型类中会发生一些黑魔法(参见
django.models.base.ModelBase,特别是__new__()方法),因此您的幼稚解决方案很可能无法按原样工作。 -
@JérômeThiard 也尝试过这样做。我还尝试使用
functools中的update.wrapper进行更新,以便类属性可以保持不变。但它会产生有关Foreign Keys的问题。 @brunodesthuilliers,是的,我只是不明白从哪里获得这些“全部”见解。能否请您指出在哪里以及如何访问django.models.base.ModelBase数据的链接。(例如,获取 theModelBase 的类属性,在外部使用它,并返回相同的属性,以便返回的属性会“表现”所需的方式。
标签: python django django-models