2015-09-02 8 views
9

मेरे Django ऐप में मैं जेनरेट की गई फ़ाइलों के लिए FileSystemStorage का उपयोग करता हूं। मैं इसे इस तरह से प्रारंभ:सेटिंग्स पर निर्भर करता है Django माइग्रेशन और फ़ाइलसिस्टम स्टोरेज

from django.core.files.base import ContentFile 
from django.db import models 

def next_number(): 
    # num = ... 
    return num 

gen_file = models.FileField(storage=gen_files_storage) 
gen_file.save('file%s.txt' % next_number(), ContentFile('')) 

यह ठीक काम करता है:

import os 
from urlparse import urljoin 

from django.conf import settings 
from django.core.files.storage import FileSystemStorage 

gen_files_storage = FileSystemStorage(location=os.path.join(settings.MEDIA_ROOT, 'generated/'), base_url=urljoin(settings.MEDIA_URL, 'generated/')) 

मैं एक नई फ़ाइल का उपयोग मैं बनानी हो तो। एकमात्र समस्या यह है कि FileSystemStorage का मार्ग Django माइग्रेशन में "हार्डकोडेड" है। क्योंकि मैं विकास (जो परिवर्तन) और उत्पादन के लिए अलग-अलग सेटिंग्स का उपयोग करता हूं, अक्सर manage.py makemigrations कमांड केवल माइग्रेशन उत्पन्न करता है क्योंकि पथ बदल जाता है, हालांकि सबकुछ डेटाबेस में समान रहता है।

मुझे पता है कि FileSystemStorage के उप-वर्ग का उपयोग करके समाधान है (नीचे मेरा उत्तर देखें), लेकिन क्या कोई बेहतर समाधान है?

import os 
from urlparse import urljoin 

from django.conf import settings 
from django.core.files.storage import FileSystemStorage 
from django.utils.deconstruct import deconstructible 

@deconstructible 
class MyFileSystemStorage(FileSystemStorage): 
    def __init__(self, subdir): 
     self.subdir = subdir 
     super(MyFileSystemStorage, self).__init__(location=os.path.join(settings.MEDIA_ROOT, self.subdir), base_url=urljoin(settings.MEDIA_URL, self.subdir)) 

    def __eq__(self, other): 
     return self.subdir == other.subdir 

तो मैं इस तरह भंडारण को प्रारंभ कर सकते हैं::

उत्तर

6

FileSystemStorage के एक कस्टम @deconstructible उपवर्ग से जुड़े एक समाधान नहीं है

import os 
from urlparse import urljoin 

from django.conf import settings 
from django.core.files.storage import FileSystemStorage 

gen_files_storage = MyFileSystemStorage('generated/') 

इस तरह Django माइग्रेशन में बदलाव नहीं दिखाई देगा मेरी सेटिंग्स। क्या कोई बेहतर तरीका है?

+1

मुझे लगता है कि यह ऐसा है: https://docs.djangoproject.com/en/1.9/howto/custom-file-storage/, https://code.djangoproject.com/ticket/22337 – Daviddd

+1

यहां एक और विकल्प है : https://github.com/translate/pootle/commit/8ff2463f0b1f1771595334df9ff9f7ba4ec33ae5#diff-0073684248aab77bd945bf6209970a09R34 – jaywink

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