Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Model Django outside models.py中重写.objects_Python_Django_Django Models - Fatal编程技术网

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模型类(cf
django.models.base.ModelBase
,特别是
\uuuu new\uuuu()
方法)中涉及到了相当多的障碍魔法,所以您的原始解决方案很可能不会按原样工作。@JérômeThiard也尝试过这样做。我还尝试使用
functools
中的
update.wrapper
进行更新,以便类属性保持不变。但它会产生有关
外键的问题@是的,我只是不知道从哪里可以得到这些“全部”的见解。你能告诉我访问
django.models.base.ModelBase
数据的位置和方式吗?(例如,获取模型库的类属性,在外部使用它,并返回相同的属性,以便返回的属性“正常工作”理想的方法。Francis Yaconiello,有一个巨大的django应用程序,我想在
模型中获得类的调用堆栈。py
,我可能不想记录所有类的调用堆栈,可能是一些。所以在现有代码中,为了简化这个所谓的“元任务”,我想使用decorator,这反过来会帮助我不干扰现有的代码。我的用例是-在运行时在django应用程序中获得所需类的调用堆栈。所以,使用decorator来完成这样的任务是不可取的?