2015-09-02 12 views
9

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?

Odpowiedz

6

Istnieje rozwiązanie obejmujące niestandardową @deconstructible podklasę 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 

Następnie można zainicjować przechowywanie takiego:

import os 
from urlparse import urljoin 

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

gen_files_storage = MyFileSystemStorage('generated/') 

ten sposób migracje Django nie zauważy zmiany w moim ustawienia. Czy jest jednak lepszy sposób?

+1

Przypuszczam, że jest tak: https://docs.djangoproject.com/en/1.9/howto/custom-file-storage/, https://code.djangoproject.com/ticket/22337 – Daviddd

+1

Oto kolejna opcja : https://github.com/translate/pootle/commit/8ff2463f0b1f1771595334df9ff9f7ba4ec33ae5#diff-0073684248aab77bd945bf6209970a09R34 – jaywink

Powiązane problemy