2016-02-02 5 views
10

Na uaktualnieniu do Django 1.9, teraz dostać ostrzeżenieJak radzić sobie z "SubfieldBase został wycofany. Zamiast tego użyj Field.from_db_value."

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

widzę gdzie pojawia się problem. Mam pewne niestandardowe definicje pól, aw nich mam __metaclass__ = models.SubfieldBase. Na przykład,

class DurationField(models.FloatField): 

    __metaclass__ = models.SubfieldBase 

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

    ... 

Jeśli instrukcja __metaclass__ jest przestarzała, co mam go zastąpić dokładnie?

Czy po prostu wyjmę i dodaję metodę from_db_value, jak w tym przykładzie: https://docs.djangoproject.com/en/1.9/howto/custom-model-fields/#converting-values-to-python-objects ?

Czym różnią się from_db_value i to_python? Obie wydają się konwertować dane bazy danych do obiektów Python?

Odpowiedz

23

Tak, należy po prostu usunąć __metaclass__ linię i dodać from_db_value() i 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): 
     ... 

Jak opisano tutaj: https://docs.djangoproject.com/en/1.9/ref/models/fields/#field-api-reference, to_python(value) konwertuje wartość (może być brak, sznurka lub obiektu) do odpowiedniego obiektu Pythona.

from_db_value(value, expression, connection, context) konwertuje wartość zwróconą przez bazę danych do obiektu Python.

Obie metody zwracają obiekty Pythona, ale są używane przez Django w różnych sytuacjach. to_python() jest wywoływana przez deserializację i podczas metody clean() używanej z formularzy. from_db_value() jest wywoływana, gdy dane są ładowane z bazy danych

+1

to jest bardzo dobra i wyczerpująca odpowiedź. @mjandrews: dlaczego nie oznaczyłeś go jako ostateczną odpowiedź? – pt12lol

+0

Znalazłem, że bez metaclass 'to_python' nie zawsze nazywa się tym samym. Na przykład, jeśli utworzysz nową instancję obiektu, a następnie spróbujesz odczytać pole niestandardowe, nie wywoła ona metod, w których metaclass wywołał metodę. –

Powiązane problemy