Django模型类__new__,传递给super.__ new__的正确参数是什么?

问题描述

在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 (将#修改为@)