Как работать с "SubfieldBase" устарел. Вместо этого используйте "Field.from_db_value".

При обновлении до 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?

Ответ 1

Да, вы должны просто удалить строку __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() вызывается, когда данные загружаются из базы данных