2016-09-08 5 views
14

Django 1.9 से 1.10 से अपग्रेड करने के बाद, मुझे django-geolocation पैकेज द्वारा प्रदान किए गए क्षेत्र के साथ व्यवहार में बदलाव का अनुभव हुआ है। https://github.com/philippbosch/django-geoposition/commit/689ff1651a858d81b2d82ac02625aae8a125b9c9Django> = 1.10 में प्रारंभिक (डीबी से लोड नहीं होने के तुरंत बाद) फ़ील्ड को तुरंत एक्सेस करने पर कस्टम मॉडल फील्ड कॉल to_python कैसे बना सकता है?

इससे पहले, यदि आप एक GeopositionField के साथ एक मॉडल प्रारंभ, और फिर तुरंत उस क्षेत्र पहुंच कर, आप वापस एक Geoposition वस्तु मिलेगा:

यह परिवर्तन है कि 1.10 अनुकूलता कि व्यवहार तोड़ दिया के लिए बनाया गया था। अब आप केवल स्ट्रिंग मान वापस प्राप्त करें जो आपने प्रारंभ में प्रदान किया था।

आप Django 1.10 के साथ समान व्यवहार कैसे प्राप्त करते हैं? क्या from_db_value जैसी कोई अन्य विधि है जिसे to_python पर कॉल करने के लिए ओवरराइड करने की आवश्यकता है?

+0

लेकिन इस पुस्तकालय का उपयोग क्यों करें ?? – e4c5

+0

@ e4c5 यह आपको अपने व्यवस्थापक पृष्ठों के लिए एक आसान Google मानचित्र विजेट देता है, और कुछ डेटा सत्यापन। – Acorn

+0

शायद यह करता है लेकिन आप इसे geodjango और बहुत से और बहुत कुछ के साथ मिलता है – e4c5

उत्तर

8

खुदाई के बाद यह पता चला है कि 1.8 में कस्टम फ़ील्ड का व्यवहार इस तरह से बदल दिया गया था कि to_python अब किसी फ़ील्ड को असाइनमेंट पर नहीं बुलाया जाता है।

https://docs.djangoproject.com/en/1.10/releases/1.8/#subfieldbase

नया दृष्टिकोण काम पर to_python() विधि फोन नहीं करता है के रूप में SubfieldBase साथ मामला था। यदि आपको उस व्यवहार की आवश्यकता है, तो अपनी परियोजना में Django के स्रोत कोड से निर्माता वर्ग को दोबारा लागू करें।

यहाँ इस परिवर्तन के बारे में कुछ और चर्चा के साथ एक Django टिकट दिया गया है: https://code.djangoproject.com/ticket/26807

तो आदेश पुराने व्यवहार आप कुछ इस तरह करने की जरूरत है बनाए रखने के लिए:

class CastOnAssignDescriptor(object): 
    """ 
    A property descriptor which ensures that `field.to_python()` is called on _every_ assignment to the field. 
    This used to be provided by the `django.db.models.subclassing.Creator` class, which in turn 
    was used by the deprecated-in-Django-1.10 `SubfieldBase` class, hence the reimplementation here. 
    """ 

    def __init__(self, field): 
     self.field = field 

    def __get__(self, obj, type=None): 
     if obj is None: 
      return self 
     return obj.__dict__[self.field.name] 

    def __set__(self, obj, value): 
     obj.__dict__[self.field.name] = self.field.to_python(value) 

और फिर इस ऐड कस्टम फ़ील्ड में:

def contribute_to_class(self, cls, name): 
    super(MyField, self).contribute_to_class(cls, name) 
    setattr(cls, name, CastOnAssignDescriptor(self)) 

इस पुल अनुरोध से समाधान लिया गया: https://github.com/hzdg/django-enumfields/pull/61

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