2015-09-02 15 views
9

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?

risposta

6

c'è una soluzione che coinvolge una consuetudine @deconstructible sottoclasse di 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 

allora posso inizializzare l'archiviazione in questo modo:

import os 
from urlparse import urljoin 

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

gen_files_storage = MyFileSystemStorage('generated/') 

In questo modo le migrazioni Django non noteranno cambiamenti nel mio impostazioni. C'è un modo migliore però?

+1

Suppongo che sia così: https://docs.djangoproject.com/en/1.9/howto/custom-file-storage/, https://code.djangoproject.com/ticket/22337 – Daviddd

+1

Ecco un'altra opzione : https://github.com/translate/pootle/commit/8ff2463f0b1f1771595334df9ff9f7ba4ec33ae5#diff-0073684248aab77bd945bf6209970a09R34 – jaywink

Problemi correlati