Как использовать django-хранилища для хранения и извлечения одного поля в моей модели - PullRequest
0 голосов
/ 04 ноября 2019

Я использую DRF для создания нашего веб-приложения, ориентированного на клиента, на моей работе. У нас есть модель профиля, которая содержит ImageField, которые представляют профиль пользователя и его фотографию соответственно. Моя работа - перестать использовать FileSystem в качестве хранилища и переключиться на s3 для хранения изображений. Я подумал, что смогу сделать это с помощью приложения django-storages. Но я не могу понять, как заставить django-storages работать только с одним полем в модели вместо использования его в качестве хранилища по умолчанию. Я попытался использовать FileField с storage, установленным на storages.backends.s3boto3.S3Boto3Storage, но не могу сохранить файл на s3. Подводя итог моему вопросу -

  1. Как настроить django-storages в качестве хранилища только для одного поля
  2. Как установить и получить поле в моей модели.
class Profile(models.Model):
    img = ImageField(upload_to=get_directory, default='img/generic_profile.jpg')
    name = CharField(max_length=256)
    new_s3_field = FileField(storage=S3Boto3Storage)
profile = Profile()
profile.new_s3_field = ContentFile('sample.jpg', open('sampel.jpg') # does not work
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 1079, in _insert
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py", line 1111, in execute_sql
    for sql, params in self.as_sql():
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py", line 1064, in as_sql
    for obj in self.query.objs
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py", line 1013, in pre_save_val
    return field.pre_save(obj, add=True)
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/files.py", line 296, in pre_save
    file.save(file.name, file.file, save=False)
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/files.py", line 93, in save
    name = self.field.generate_filename(self.instance, name)
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/files.py", line 330, in generate_filename
    filename = posixpath.join(dirname, filename)
  File "/usr/lib/python2.7/posixpath.py", line 75, in join
    if b.startswith('/'):
AttributeError: 'file' object has no attribute 'startswith'
...