2015-09-02 11 views
9

In meiner Django App verwende ich eine FileSystemStorage für generierte Dateien. Ich initialisieren es wie folgt aus:Django Migrationen und FileSystemStorage in Abhängigkeit von den Einstellungen

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/')) 

Wenn ich eine neue Datei erstellt werden soll ich verwenden:

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('')) 

Das funktioniert gut. Das einzige Problem ist, dass der Pfad FileSystemStorage in der Django-Migration "fest codiert" ist. Da ich verschiedene Einstellungen für die Entwicklung (was ändert) und die Produktion verwendet, generiert der Befehl manage.py makemigrations oft nur dann eine Migration, weil sich der Pfad geändert hat, obwohl in der Datenbank alles gleich bleibt.

Ich weiß, es gibt eine Lösung mit einer Unterklasse von FileSystemStorage (siehe meine Antwort unten), aber gibt es eine bessere Lösung?

Antwort

6

Es gibt eine Lösung, die eine benutzerdefinierte Unterklasse von @deconstructibleFileSystemStorage beteiligt: ​​

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 

Dann kann ich den Speicher wie folgt initialisieren:

import os 
from urlparse import urljoin 

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

gen_files_storage = MyFileSystemStorage('generated/') 

Auf diese Weise Django Migrationen werden keine Änderungen feststellen, in meinem die Einstellungen. Gibt es einen besseren Weg?

+1

Ich nehme an, es ist so: https://docs.djangoproject.com/en/1.9/howto/custom-file-storage/, https://code.djangoproject.com/ticket/2237 – Daviddd

+1

Hier ist eine andere Option : https://github.com/translate/pootle/commit/8ff2463f0b1f1771595334df9ff9f7ba4ec33ae5#diff-0073684248aab77bd945bf6209970a09R34 – jaywink

Verwandte Themen