AttributeError: Получил AttributeError при попытке получить значение для поля `files` в сериализаторе` FilesSerializer` - PullRequest
0 голосов
/ 09 июля 2020

Я загружаю несколько файлов со своего vue фронтального на мой сервер drf. Хотя файлы ДЕЙСТВИТЕЛЬНО отправляются и публикуются (спасибо кому-то здесь, кстати), эта ошибка продолжает появляться:

AttributeError: Получил AttributeError при попытке получить значение для поля files в сериализаторе FilesSerializer. Поле сериализатора может быть названо неправильно и не соответствовать ни одному атрибуту или ключу в экземпляре list. Исходный текст исключения был: объект 'list' не имеет атрибута 'files'.

views.py

class FileViewSet(viewsets.ModelViewSet):
    parser_classes = (FormParser,MultiPartParser)
    queryset = File.objects.all()
    serializer_class = FileSerializer

serializers.py

    class FilesSerializer(serializers.Serializer):
    files = serializers.ListField(child=serializers.FileField())
    #files = serializers.ListField(child=FileSerializer())

    def create(self, validated_data):
        files = validated_data['files']
        file_objs = [File.objects.create(file=file) for file in files]
        return file_objs

models.py

class File(models.Model):
    file = models.FileField(upload_to='files/')
    uploaded_at = models.DateTimeField(auto_now_add=True)

    def delete(self, *args, **kargs):
        self.file.delete()
        super().delete(*args, **kargs)

Что отправляется с моего внешнего интерфейса:

введите описание изображения здесь Есть идеи?

1 Ответ

1 голос
/ 09 июля 2020

Проблема возникает из-за того, что DRF использует тот же сериализатор для создания ответа, поэтому он пытается получить files из значения, возвращенного методом create (это список). Если на самом деле вам не нужно возвращать ответ, вы можете установить поле files как write_only:

class FilesSerializer(serializers.Serializer):
    files = serializers.ListField(child=serializers.FileField(), write_only=True)

Если вам действительно нужен какой-то ответ (список объектов File), вам понадобится чтобы перезаписать FileViewSet.create

 class FileViewSet():
    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        response_serializer = FileSerializer(instance=serializer.instance, many=True)
        return Response(response_serializer.data, status=status.HTTP_201_CREATED)
...