W mojej aplikacji Django używam FileSystemStorage
dla wygenerowanych plików. Zainicjować to tak:Migracje Django i FileSystemStorage w zależności od ustawień
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/'))
Kiedy chcę, aby utworzyć nowy plik używać:
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(''))
który działa dobrze. Jedynym problemem jest to, że ścieżka FileSystemStorage
jest "zakodowana" w migracji Django. Ponieważ używam różnych ustawień do programowania (które się zmienia) i do produkcji, często komenda manage.py makemigrations
generuje migrację tylko dlatego, że ścieżka uległa zmianie, chociaż wszystko pozostaje takie samo w bazie danych.
Wiem, że istnieje rozwiązanie z wykorzystaniem podklasy FileSystemStorage
(zobacz moją odpowiedź poniżej), ale czy istnieje lepsze rozwiązanie?
Przypuszczam, że jest tak: https://docs.djangoproject.com/en/1.9/howto/custom-file-storage/, https://code.djangoproject.com/ticket/22337 – Daviddd
Oto kolejna opcja : https://github.com/translate/pootle/commit/8ff2463f0b1f1771595334df9ff9f7ba4ec33ae5#diff-0073684248aab77bd945bf6209970a09R34 – jaywink