2015-09-02 19 views
9

Django uygulamasında oluşturulan dosyalar için FileSystemStorage kullanıyorum. Böyle başlatılamıyor: iyi çalışırAyarlara bağlı olarak Django geçişleri ve FileSystemStorage

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

:

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

kullandığım yeni bir dosya oluşturmak istediğinizde. Tek sorun, FileSystemStorage'un yolunun Django geçişinde "kodlanmış" olmasıdır. Geliştirme için farklı ayarlar kullandığım için (ki bu da değişir) ve üretim, genellikle manage.py makemigrations komutu yalnızca yol değiştiğinden, her şey veri tabanında aynı kalmasına rağmen bir geçiş oluşturur.

FileSystemStorage'un bir alt sınıfını kullanarak bir çözüm olduğunu biliyorum (aşağıdaki cevaba bakın), ancak daha iyi bir çözüm var mı?

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 

Sonra böyle depolama başlatabilir:

cevap

6

FileSystemStorage özel bir @deconstructible alt sınıf içeren bir çözüm vardır

import os 
from urlparse import urljoin 

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

gen_files_storage = MyFileSystemStorage('generated/') 

Django göçler değişiklikler fark olmayacaktır Bu şekilde benim ayarlar. Yine de daha iyi bir yolu var mı?

+1

Sanırım şunun gibi: https://docs.djangoproject.com/en/1.9/howto/custom-file-storage/, https://code.djangoproject.com/ticket/22337 – Daviddd

+1

İşte başka bir seçenek : https://github.com/translate/pootle/commit/8ff2463f0b1f1771595334df9ff9f7ba4ec33ae5#diff-0073684248aab77bd945bf6209970a09R34 – jaywink

İlgili konular