升级到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_value
和to_python
有何不同?两者似乎都将数据库数据转换为Python对象?
答案 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-reference,to_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