Хранилище Django S3 - сохранить путь к файлу только без файла с использованием ModelSerializer

Я использую boto3 для загрузки файлов на S3 и сохранения их пути в FileField.

class SomeFile(models.Model):
    file = models.FileField(upload_to='some_folder', max_length=400, blank=True, null=True)

Для приведенной выше модели для создания записи работает следующий код.

ff = SomeFile(file='file path in S3')
ff.full_clean()
ff.save()

Теперь, когда я использую ModelSerializer, чтобы сделать то же самое.

class SomeFileSerializer(serializers.ModelSerializer):
    class Meta:
        model = SomeFile
        fields = ('file')

Я получаю эту ошибку после запуска кода ниже

rest_framework.exceptions.ValidationError: {'file': [ErrorDetail(string='Отправленные данные не были файлом. Проверьте тип кодировки в форме.', code='invalid')]}

serializer = SomeFileSerializer(data={'file': 'file path to S3'})
serializer.is_valid(raise_exception=True)

Мне нужна помощь в настройке сериализатора для принятия пути к файлу без фактического наличия файла.


person Sai Chander    schedule 13.01.2020    source источник
comment
почему бы просто не использовать urlfield? сохраните файлы с функциями обработчика AWS, и ответ будет подписанным URL-адресом, который вы можете сохранить в urlfield   -  person ans2human    schedule 13.01.2020
comment
Я новичок в Джанго. Я не хочу хранить полные URL-адреса, а хочу хранить только относительные пути. Я также предположил, что использование FileField поможет мне сократить объем кода, и все статьи, в которых использовался boto3, использовали FileField. Кроме того, если мы перейдем к какому-то локальному развертыванию, где изображения могут храниться локально, наличие FileField может помочь в переписывании некоторых вещей.   -  person Sai Chander    schedule 13.01.2020
comment
Отвечает ли это на ваш вопрос? Django REST Framework и абсолютный URL-адрес FileField   -  person Oleg Russkin    schedule 13.01.2020
comment
@OlegRusskin, я уже видел это. На самом деле это полезно при чтении данных с помощью сериализатора, но я не уверен, как сериализатор узнает, что делать при записи записей.   -  person Sai Chander    schedule 14.01.2020
comment
Вы можете использовать разные сериализаторы для чтения и записи. Для чтения используйте URLField или MethodField, чтобы ответить URL-адресом, для записи — FileField. Также загрузка файла может быть совершенно отдельной операцией/просмотром. Или он может принять URL-адрес и загрузить файл с предоставленного URL-адреса, подтвердить, сохранить на S3...   -  person Oleg Russkin    schedule 14.01.2020
comment
@OlegRusskin, я понимаю, что ты сказал для чтения. Звучит неплохо. Что касается записи, файл уже загружен в облако откуда-то еще. Теперь я хочу вставить запись в таблицу со ссылкой на этот загруженный файл. Я не хочу скачивать с URL. Вместо этого сохраните путь напрямую.   -  person Sai Chander    schedule 15.01.2020