Nella mia app Django uso uno FileSystemStorage
per i file generati. Inizializzo in questo modo:Migrazioni di Django e FileSystemStorage a seconda delle impostazioni
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/'))
Quando voglio creare un nuovo file che uso:
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(''))
che funziona bene. L'unico problema è che il percorso di FileSystemStorage
è "hardcoded" nella migrazione di Django. Poiché utilizzo diverse impostazioni per lo sviluppo (che cambia) e la produzione, spesso il comando manage.py makemigrations
genera una migrazione solo perché il percorso è cambiato, sebbene tutto resti uguale nel database.
So che esiste una soluzione che utilizza una sottoclasse di FileSystemStorage
(vedere la mia risposta di seguito), ma esiste una soluzione migliore?
Suppongo che sia così: https://docs.djangoproject.com/en/1.9/howto/custom-file-storage/, https://code.djangoproject.com/ticket/22337 – Daviddd
Ecco un'altra opzione : https://github.com/translate/pootle/commit/8ff2463f0b1f1771595334df9ff9f7ba4ec33ae5#diff-0073684248aab77bd945bf6209970a09R34 – jaywink