2016-02-02 34 views
10

在升級到1.9 Django的,我現在得到警告如何處理「SubfieldBase已被棄用,請改用Field.from_db_value」。

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對象?

回答

23

是的,你應該刪除__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)值(可無,字符串或對象)轉換成正確的Python對象。

from_db_value(value, expression, connection, context)將數據庫返回的值轉換爲Python對象。

因此,這兩種方法都會返回Python對象,但Django會在不同情況下使用它們。通過反序列化調用to_python(),並在表單中使用clean()方法。當從數據庫加載數據時調用from_db_value()

+1

這是非常好的和全面的答案。 @mjandrews:你爲什麼不把它標記爲最終答案? – pt12lol

+0

我發現沒有元類,'to_python'並不總是被調用。例如,如果您創建一個對象的新實例,然後嘗試讀取自定義字段,它將不會調用其調用該方法的元類的方法。 –

相關問題