मेरे 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
तो मैं इस तरह भंडारण को प्रारंभ कर सकते हैं::
मुझे लगता है कि यह ऐसा है: https://docs.djangoproject.com/en/1.9/howto/custom-file-storage/, https://code.djangoproject.com/ticket/22337 – Daviddd
यहां एक और विकल्प है : https://github.com/translate/pootle/commit/8ff2463f0b1f1771595334df9ff9f7ba4ec33ae5#diff-0073684248aab77bd945bf6209970a09R34 – jaywink