如何处理“SubfieldBase已被弃用。请改用Field.from_db_value。”

时间:2016-02-02 23:53:25

标签: django django-models

升级到Django 1.9后,我现在收到警告

RemovedInDjango110Warning: SubfieldBase has been deprecated. Use Field.from_db_value instead.

我知道问题出在哪里。我有一些自定义字段定义,其中我有__metaclass__ = models.SubfieldBase。例如,

class DurationField(models.FloatField):

    __metaclass__ = models.SubfieldBase

    def __init__(self, *args, **kwargs):

    ...

如果不推荐使用__metaclass__语句,我应该用什么来替换它?

我是否只是将其取出并添加from_db_value方法,如下例所示:https://docs.djangoproject.com/en/1.9/howto/custom-model-fields/#converting-values-to-python-objects

from_db_valueto_python有何不同?两者似乎都将数据库数据转换为Python对象?

2 个答案:

答案 0 :(得分:32)

是的,您应该删除__metaclass__行并添加from_db_value()to_python()

class DurationField(models.FloatField):

    def __init__(self, *args, **kwargs):
        ...

    def from_db_value(self, value, expression, connection, context):
        ...

    def to_python(self, value):
        ...

如下所述:https://docs.djangoproject.com/en/1.9/ref/models/fields/#field-api-referenceto_python(value)将值(可以是None,string或object)转换为正确的Python对象。

from_db_value(value, expression, connection, context)将数据库返回的值转换为Python对象。

因此,两个方法都返回Python对象,但Django在不同情况下使用它们。通过反序列化以及从表单中使用的to_python()方法调用clean()。从数据库加载数据时调用from_db_value()

答案 1 :(得分:2)

虽然ozren是正确的,但有一个巨大的区别,SubfieldBase有一个非常脏的副作用,它总是在给定模型字段的值赋值时调用to_python方法。最近我被Django 1.9升级到1.10时被咬了。

请参阅:

https://docs.djangoproject.com/en/2.1/releases/1.8/#subfieldbase