2017-02-01 9 views
9

मेरे पास बेस 64 फ़ील्ड है जो django स्निपेट से कॉपी की गई है।django कस्टम बेस 64 फ़ील्ड माइग्रेट कैसे करें। फ़ील्ड मौजूद नहीं है

https://djangosnippets.org/snippets/1669/

class Base64Field(models.TextField): 
    """ 
    https://djangosnippets.org/snippets/1669/ 
    Example use: 
    class Foo(models.Model): 
     data = Base64Field() 

    foo = Foo() 
    foo.data = 'Hello world!' 
    print foo.data # will 'Hello world!' 
    print foo.data_base64 # will print 'SGVsbG8gd29ybGQh\n' 

    """ 

    def contribute_to_class(self, cls, name): 

     if not self.db_column: 
      self.db_column = name 

     self.field_name =name+ '_base64' 
     super(Base64Field, self).contribute_to_class(cls, self.field_name) 
     setattr(cls, name, property(self.get_data, self.set_data)) 

    def get_data(self, obj): 
     return base64.decodestring(getattr(obj, self.field_name)) 

    def set_data(self, obj, data): 
     setattr(obj, self.field_name, base64.encodestring(data)) 

    def deconstruct(self): 
     ame, path, args, kwargs = super(Base64Field, self).deconstruct() 
     from pprint import pprint 
     pprint(vars(self)) 
     return ame, path, args, kwargs 

मैं समस्याओं का सामना कर रहा है, जबकि इस क्षेत्र की ओर पलायन उदा

class EmailStatus(models.Model): 
    attachment = Base64Field(null=True, blank=True, db_column='attachment', name="attachment", verbose_name="attachment") 

त्रुटि मैं जबकि पलायन हो रही है

raise FieldDoesNotExist('%s has no field named %r' % (self.object_name, field_name)) 

django.core.exceptions.FieldDoesNotExist: EmailStatus has no field named u'attachment'

अब मैं क्यों कि क्या हो रहा है देख सकते हैं। लेकिन इसके चारों ओर एक रास्ता नहीं पता लगा सकते हैं। मुझे लगता है कि मुझे deconstruct क्षेत्र में कुछ बदलने की जरूरत हो सकती है। मैंने इसके लिए कई चीजों की कोशिश की है लेकिन उनमें से सभी टूट गए हैं।

उदा। _base64 को हटा रहा है। डेटा को सहेजने और पुनर्प्राप्त करते समय यह काम नहीं करता है।

मैंने माइग्रेशन फ़ाइल में नाम बदलने की कोशिश की जो यह काम नहीं करता है।

class Migration(migrations.Migration): 

    initial = True 

    dependencies = [ 
     migrations.swappable_dependency(settings.AUTH_USER_MODEL), 
    ] 

    operations = [ 
     migrations.CreateModel(name='EmailStatus', 
      fields=[('attachment', gradsite.gradnotes.models.Base64Field(blank=True, null=True)),])] 

मुझे लगता है कि माइग्रेशन ऑटो-डिटेक्टर contribute_to_class में नाम में परिवर्तन के कारण भ्रमित हो रहा है। मुझे यकीन नहीं है कि चारों ओर एक काम क्या हो सकता है।

+0

कृपया जांचें कि contribute_to_class, get_data और अन्य विधियां कक्षा 6464 के अंदर हैं या नहीं। – MicroPyramid

+0

वे कक्षा – Akamad007

+0

के अंदर हैं मैंने एक उत्तर दिया है, क्या यह आपकी मदद करता है? –

उत्तर

2
class Base64Field(models.TextField): 
    def contribute_to_class(self, cls, name, private_only=False): 
     if not self.db_column: 
      self.db_column = name 

     self.field_name = name + '_base64' 
     super().contribute_to_class(cls, 
            name) 
     setattr(cls, self.field_name, property(self.get_data, self.set_data)) 

    def get_data(self, obj): 
     return base64.b64encode(getattr(obj, self.name).encode('utf-8')) 

    def set_data(self, obj, data): 
     setattr(obj, self.field_name, base64.b64decode(data).decode('utf-8')) 

ऐसा लगता है। और name के बीच contribute_to_class में एक गलत मिश्रण का उपयोग किया गया था (इसलिए makemigrationsmigrate का उपयोग करते समय दूसरी बार फ़ील्ड नहीं उठा रहा था)।

मैंने पायथन 3 विशिष्ट परिवर्तन किए हैं, अर्थात् super कॉल और base64 फ़ंक्शंस का उपयोग। set_data विधि गलत हो सकती है (मैंने उसमें बहुत अधिक ध्यान नहीं दिया, क्योंकि आप पाइथन 2 का उपयोग कर रहे हैं और एन्कोडिंग अलग-अलग होंगे), लेकिन माइग्रेशन काम करते हैं।

जोड़ा गया बोनस: private_only तर्क आपके contribute_to_class विधि से अनुपलब्ध था।

यहाँ मैं क्या हो रही है है:

from test_app import models 

e = models.EmailStatus() 
e.attachment = "Hello world!" 

e.attachment # Prints 'Hello world!' 
e.attachment_base64 # Prints b'SGVsbG8gd29ybGQh' 
1

आप के लिए उपयोगी लिंक।

https://code.djangoproject.com/ticket/24563

उपयोगी टिप्स:

में नाकाम रहने के स्थानांतरण के बाद: https://github.com/codefisher/djangopress/blob/master/djangopress/forum/migrations/0011_auto_20150426_1821.py

मॉडल: https://github.com/codefisher/djangopress/blob/master/djangopress/forum/models.py

यह हो सकता है दूसरों के लिए मदद करता है।

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