Python 在Model Django outside models.py中重写.objects
我想重写Python 在Model Django outside models.py中重写.objects,python,django,django-models,Python,Django,Django Models,我想重写models.py中的类,以便在运行时获得调用堆栈 我知道我们可以在Django中执行以下操作,以覆盖manager,从而定制QuerySet API- 因此,在models.py中 class A(models.Model): objects = SomeClass() def decoratorForOverriding(cls): cls.objects = SomeClass() 在SomeClass class B(Manager): def get
models.py
中的类,以便在运行时获得调用堆栈
我知道我们可以在Django中执行以下操作,以覆盖manager,从而定制QuerySet API-
因此,在models.py中
class A(models.Model):
objects = SomeClass()
def decoratorForOverriding(cls):
cls.objects = SomeClass()
在SomeClass
class B(Manager):
def get_query_set():
# override the way you want
但是,为了使事情更简单,我想使用decorator来覆盖相同的-So,
在models.py中
class A(models.Model):
objects = SomeClass()
def decoratorForOverriding(cls):
cls.objects = SomeClass()
@decoratorForOverriding
A类(型号.型号):
通过
在decorator.py中
class A(models.Model):
objects = SomeClass()
def decoratorForOverriding(cls):
cls.objects = SomeClass()
我得到的错误是
AttributeError: 'NoneType' object has no attribute '_meta'
知道发生了什么吗?
我是否应该将A类
设置为Abstract类?这也不起作用。您提到您知道如何覆盖模型的管理器。我很难想象在一个装饰者身上凌驾于管理者之上的好处是什么,而不是作为一个财产。正如bruno desthuilliers在他的评论中提到的,Django在实例化时使用objects属性做了大量工作,装饰器可能无法工作
按照Django core的预期方式执行此操作:
否则会增加技术债务,而不会带来任何实际好处(至少据我所知)。如果有一些东西不能通过管理器实现,让我们来解决这个问题。你想实现什么?装饰师必须返回一些东西。这里它应该返回修改过的类。还要注意,django模型类(cfdjango.models.base.ModelBase
,特别是\uuuu new\uuuu()
方法)中涉及到了相当多的障碍魔法,所以您的原始解决方案很可能不会按原样工作。@JérômeThiard也尝试过这样做。我还尝试使用functools
中的update.wrapper
进行更新,以便类属性保持不变。但它会产生有关外键的问题@是的,我只是不知道从哪里可以得到这些“全部”的见解。你能告诉我访问django.models.base.ModelBase
数据的位置和方式吗?(例如,获取模型库的类属性,在外部使用它,并返回相同的属性,以便返回的属性“正常工作”理想的方法。Francis Yaconiello,有一个巨大的django应用程序,我想在模型中获得类的调用堆栈。py
,我可能不想记录所有类的调用堆栈,可能是一些。所以在现有代码中,为了简化这个所谓的“元任务”,我想使用decorator,这反过来会帮助我不干扰现有的代码。我的用例是-在运行时在django应用程序中获得所需类的调用堆栈。所以,使用decorator来完成这样的任务是不可取的?