Django Модель использования хранилища FileField зависит от настроек - PullRequest
1 голос
/ 24 января 2020

Я хотел бы управлять django мультимедийными файлами локально и в aws s3, у меня есть вся конфигурация, и если я указываю класс хранения в модели, он работает нормально, но это не практично, потому что я должен выполнять миграцию каждый раз, но я хотел бы установить sh, что конфигурация файла зависит от переменной конфигурации, называемой «FILES», для программной работы.

Это код

settings.py

FILE_OVERWRITE = True

if FILES == 'LOCAL':
  MEDIA_ROOT = os.path.join(BASE_DIR, "media")
  MEDIAFILES_STORAGE = 'app.files.CustomStorage'
  MEDIA_URL = '/media/'

elif FILES == 'AWS':
  MEDIAFILES_STORAGE = 'app.files.MediaStorage'
  MEDIA_URL='https://%s/%s/' % (AWS_S3_CUSTOM_DOMAIN, MEDIA_LOCATION)

storages.py

class CustomStorage(FileSystemStorage):

  def get_available_name(self, name, *args, **kwargs):

    if self.exists(name):

      if settings.FILE_OVERWRITE:
        os.remove(os.path.join(settings.MEDIA_ROOT, name))
      else:
        alternative_name = name.split('.')
        name = alternative_name[0] + str(timezone.now()).split(' ')[0] + '.' + alternative_name[1]

    return name

class MediaStorage(S3Boto3Storage):
  location = settings.MEDIA_LOCATION
  file_overwrite = settings.FILE_OVERWRITE

models.py

class Bill(ChangesMixin, models.Model):

  #pdf = models.FileField(storage=CustomStorage(), upload_to='media/', blank=True, null=True) <-- on local with this class works well
  #pdf = models.FileField(storage=MediaStorage(), upload_to='media/', blank=True, null=True)  <-- on aws with this class works well

  # throw an error because settings class name is not callable
  pdf = models.FileField(storage=settings.MEDIAFILES_STORAGE, upload_to='media/', blank=True, null=True)

Кто-нибудь может мне помочь? Как я могу это сделать?

Заранее спасибо.

1 Ответ

0 голосов
/ 24 января 2020

Параметр DEFAULT_FILE_STORAGE позволяет вам установить хранилище по умолчанию. Это устраняет необходимость назначать `хранилища отдельным полям и устраняет необходимость создавать файлы миграции, даже если хранилище изменяется.

docs: https://docs.djangoproject.com/en/3.0/ref/settings/#default -file-storage

Я рекомендую разделить файлы настройки settings.py на файлы конфигурации local.py и production.py. Это исключает оператор if внутри файла конфигурации. Посмотрите файл конфигурации для проекта, над которым я работаю: https://github.com/youngminz/mma-portal/tree/master/mma_portal/settings

...