问题描述
在Django super().__new__
类中实现__new__
时传递给Model
的正确参数是什么?
大多数Django模型类不需要自定义__new__
构造函数,但我正在实现一个(出于我认为与该问题无关的目的)的作用。
(是的,我知道__init__
初始化程序方法对于在创建之后自定义实例是正确的。我的目的是在{em>之前 {1}}方法被调用;这就是__init__
的目的。)
the constructor method,__new__
的Python文档尚不清楚到底要传递什么参数。它说的是方法:
[…]将请求实例的类作为其第一个参数。其余参数是传递给对象构造函数表达式(对类的调用)的参数。 new ()的返回值应该是新的对象实例(通常是cls的实例)。
典型的实现通过使用super()调用超类的 new ()方法来创建类的新实例。 new (cls [,...])与适当的参数,然后在返回之前根据需要修改新创建的实例。
失败:__new__
的传递
以上文档暗示“典型” *args,**kwargs
实现应:
__new__
当我尝试在Django模型类上执行此操作时:
def __new__(cls,*args,**kwargs):
instance = super().__new__(cls,**kwargs)
do_some_customisation_of(instance)
return instance
Python引发class LoremIpsum(django.db.models.Model):
id = django.db.models.IntegerField(primary_key=True,…)
dolor = django.db.models.FileField(…)
def __new__(cls,**kwargs):
instance = super().__new__(cls,**kwargs)
do_some_customisation_of(instance.dolor)
return instance
,抱怨我传递了太多参数:
TypeError
奇怪;肯定是 File "…/models.py",line 83,in __new__
instance = super().__new__(cls,**kwargs)
TypeError: object.__new__() takes exactly one argument (the type to instantiate)
的实现负责使用正确的参数调用django.db.models.Model.__new__
?
失败:不传递任何参数
但是,我会尝试删除object.__new__
实现中的所有参数:
__new__
Python再次引发class LoremIpsum(django.db.models.Model):
id = django.db.models.IntegerField(primary_key=True,…)
dolor = django.db.models.FileField(…)
def __new__(cls):
instance = super().__new__(cls)
do_some_customisation_of(instance.dolor)
return instance
,这次抱怨我的TypeError
方法太少了(em)参数:
__new__
这是预料之中的; File "…/django/core/serializers/base.py",line 270,in build_instance
return Model(**data)
TypeError: __new__() got an unexpected keyword argument 'id'
类当然会尝试在新实例上定义模型字段,因此应沿构造函数链传递它们。
还有什么其他选择?
这些似乎不兼容。如果传递不能为空,也不能为接收到的参数,则其他方法必须正确。但是呢?
在Django模型上为Model
方法传递的正确方法签名和参数是什么?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)