2016-02-02 8 views
10

उन्नयन पर Django 1.9, मैं अब चेतावनी"सबफील्डबेस को किस प्रकार से निपटने के लिए हटा दिया गया है। इसके बजाय 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_value और to_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-reference, to_python(value) सही अजगर वस्तु में मूल्य (कोई भी हो सकता है, स्ट्रिंग या वस्तु) धर्मान्तरित।

from_db_value(value, expression, connection, context) डेटाबेस द्वारा एक पायथन ऑब्जेक्ट में लौटाए गए मान को परिवर्तित करता है।

तो, दोनों विधियां पायथन ऑब्जेक्ट लौटती हैं, लेकिन इन्हें विभिन्न स्थितियों में डीजेगो द्वारा उपयोग किया जाता है। to_python() को deserialization और clean() के रूप में प्रपत्रों से प्रयुक्त विधि के माध्यम से बुलाया जाता है। from_db_value() को तब कहा जाता है जब डेटा डेटाबेस से लोड किया जाता है

+1

यह बहुत अच्छा और व्यापक उत्तर है। @mjandrews: आपने इसे अंतिम उत्तर के रूप में क्यों चिह्नित नहीं किया है? – pt12lol

+0

मैंने पाया है कि मेटाक्लास के बिना, 'to_python' को हमेशा वही नहीं कहा जाता है। उदाहरण के लिए, यदि आप किसी ऑब्जेक्ट का नया उदाहरण बनाते हैं और फिर कस्टम फ़ील्ड को पढ़ने का प्रयास करते हैं तो यह उन तरीकों को कॉल नहीं करेगा जहां मेटाक्लास के साथ यह विधि को कॉल करता है। –

संबंधित मुद्दे