2015-09-15 8 views
6

के साथ Django "परिवर्तन माइग्रेशन में प्रतिबिंबित नहीं होता है" मेरा Django 1.8 ऐप एक तृतीय-पक्ष ऐप (django-avatar) का उपयोग करता है जिसका मॉडल एक छवि फ़ील्ड होता है। मैं अपने प्रोजेक्ट की सेटिंग्स.py में एक कस्टम DEFAULT_FILE_STORAGE (से S3BotoStorage) का भी उपयोग कर रहा हूं। नतीजतन, हर बार जब मैं manage.py migrate चलाने के लिए, मैं इस चेतावनी अवतार अनुप्रयोग के बारे में मिलता है:छविगोल्ड और कस्टम स्टोरेज

आपका मॉडल परिवर्तन है कि अभी तक एक माइग्रेशन में परिलक्षित नहीं कर रहे हैं, और इसलिए लागू नहीं किया जाएगा। नए माइग्रेशन बनाने के लिए 'manage.py makemigrations' चलाएं, और फिर उन्हें लागू करने के लिए 'manage.py माइग्रेट' को फिर से चलाएं।

... क्योंकि avatar's initial migration संदर्भ Django के डिफ़ॉल्ट FileSystemStorage। makemigrations रनिंग अवतार अनुप्रयोग में एक नया 0002 माइग्रेशन द्वारा बनाए, इसके ImageField के भंडारण अपने प्रोजेक्ट सेटिंग से मिलान करने के लिए:

... 
migrations.AlterField(
    model_name='avatar', 
    name='avatar', 
    field=models.ImageField(storage=storages.backends.s3boto.S3BotoStorage(), max_length=1024, upload_to=avatar.models.avatar_file_path, blank=True), 
), 

समस्या है, इस के लिए नया माइग्रेशन अपने प्रोजेक्ट के बाहर अजगर की साइट-संकुल में स्थापित अवतार में बनाई गई है है, (इसलिए गिट नियंत्रण के बाहर, तैनाती के लिए अनुपलब्ध, आदि)।

सही तरीके से कस्टम DEFAULT_FILE_STORAGE के साथ एक परियोजना में एक ImageField (या FileField) का उपयोग करता है एक तीसरे पक्ष के अनुप्रयोग के लिए माइग्रेशन को संभालने के लिए क्या है? मैंने माना है:

  • चेतावनी को अनदेखा करें। स्टोरेज बदलने के लिए माइग्रेशन वास्तव में डीबी स्कीमा को प्रभावित नहीं करता है, और चूंकि मेरी प्रोजेक्ट का DEFAULT_FILE_STORAGE S3BotoStorage प्रारंभ होने के बाद से, कोई डेटा माइग्रेशन की आवश्यकता नहीं है।

  • अवतार के माइग्रेशन को मेरे प्रोजेक्ट में स्थानांतरित करने के लिए settings.MIGRATION_MODULES का उपयोग करें। (और फिर ध्यान से मेरी नकल के लिए हर भविष्य अवतार प्रवास से अधिक पोर्ट - जो त्रुटि प्रवण लगता है।) [संपादित करें:। this comment Django उपयोगकर्ताओं मेलिंग सूची पर पता चलता है यह गलत तरीका है]

  • पूछें django-अवतार (या django-storages-redux) रखरखाव बदलने के लिए ... क्या?

  • या ... - (नहीं समस्या यह है कि Btw, S3BotoStorage पहले से ही deconstructible है।)?

+0

अरे मेडमुंड, मैं डीजेंगो-अवतार का वर्तमान रखरखाव हूं और मैं इसका जवाब जानना चाहूंगा। क्या आपको लगता है कि एक और माइग्रेशन बनाना जो 'ImageField.storage' विशेषता को 'सेटिंग्स.AVATAR_STORAGE' संदर्भित करता है, इसे रोक देगा? – grantmcconnaughey

+0

हे ग्रांट, पैकेज के लिए धन्यवाद! तो, आप django-अवतार में एक स्कीमा माइग्रेशन जोड़ देंगे और इसे 'स्टोरेज = get_storage_class (settings.AVATAR_STORAGE)() 'जैसे कुछ करने के लिए मैन्युअल रूप से संपादित करेंगे?मुझे लगता है कि मेरी समस्या का समाधान हो सकता है, लेकिन आपको हर भविष्य में django-अवतार स्कीमप्रेशन को उसी तरह संपादित करना याद रखना होगा। साथ ही, यह * लोगों को वास्तव में एक स्टोरेज से दूसरे स्थानांतरित करने की कोशिश कर रहा है, क्योंकि यह माइग्रेशन के समय राज्य को ठंडा नहीं कर सकता है (शायद - इस बारे में निश्चित नहीं है)। – medmunds

+0

Django ट्रैकर ([22373] (https://code.djangoproject.com/ticket/22373) और [22337] (https://code.djangoproject.com/ticket/22337) में माइग्रेशन और स्टोरेज की कुछ चर्चा है।), लेकिन तीसरे पक्ष के ऐप्स के संदर्भ में इनमें से कोई भी नहीं। मुझे आश्चर्य है कि क्या इससे इस मुद्दे को उठाने में मदद मिलेगी? – medmunds

उत्तर

1

जवाब Django-अवतार देखरेख पूछो इसे ठीक करने के लिए है ...।

यदि आप केवल डिफ़ॉल्ट संग्रहण का उपयोग करना चाहते हैं तो आपको None या django.core.files.storage.default_storage से ImageField पर जाना चाहिए। इस मामले में storage kwarg माइग्रेशन में फ़ील्ड को पास नहीं किया जाएगा।

मैंने इसे ठीक करने के लिए PR बनाया।

+0

अच्छा: 'default_storage' - इसके बारे में नहीं पता था। Django-अवतार को अब भी [django.core.files.storage.FileSystemStorage() 'के स्पष्ट संदर्भ को ओवरराइड करने के लिए एक नए माइग्रेशन की आवश्यकता नहीं होगी [https://github.com/grantmcconnaughey/django- अवतार/ब्लॉब/2.1.1/अवतार/माइग्रेशन/0001_initial.py # L23)? – medmunds

+0

@medmunds मैंने अभी पीआर में मौजूदा माइग्रेशन को संशोधित किया है, हालांकि मुझे यकीन नहीं है कि यह सही दृष्टिकोण है या नहीं, –

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