【问题标题】:AttributeError: Got AttributeError when attempting to get a value for field `files` on serializer `FilesSerializer`AttributeError:尝试获取序列化程序`FilesSerializer`上字段`files`的值时出现AttributeError
【发布时间】:2020-07-09 10:46:54
【问题描述】:

我正在将多个文件从我的 vue 前端上传到我的 drf 后端。 虽然文件确实被发送和发布(感谢这里的某人),但此错误不断出现:

AttributeError:尝试在序列化程序 FilesSerializer 上获取字段 files 的值时出现 AttributeError。 序列化程序字段可能命名不正确,并且与 list 实例上的任何属性或键都不匹配。 原始异常文本是:“列表”对象没有属性“文件”。

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)

我的前端发送了什么:

有什么想法吗?

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    出现问题是因为 DRF 使用相同的序列化程序来产生响应,因此它尝试从 create 方法返回的值中获取 files(它是一个列表)。如果您实际上不需要返回响应,则可以将字段files设置为write_only

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

    如果您确实需要一些响应(文件对象列表),则需要覆盖 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)
    

    【讨论】:

    • Alexandr,它现在完美运行,我使用了您的第二个解决方案,并在 create def 之前添加了 serilizer_class。再次感谢您的详细回答。祝你有美好的一天
    猜你喜欢
    • 1970-01-01
    • 2022-08-11
    • 2023-02-03
    • 2022-11-29
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多