django rest框架保存base64文件

时间:2017-08-19 08:52:20

标签: django django-rest-framework

如何在django rest框架中处理base64文件字段。我正在使用django额外的字段,但它不起作用。

serializers.py

from drf_extra_fields.fields import Base64FileField

class ProductSerializer(serializers.ModelSerializer):

    file  = Base64FileField()
    class Meta:
        model = Product

        fields = (
                    "name",
                    "file"
                )



class ProductApi(SerializerMixin, APIView):
    serializer_class = ProductSerializer
    def post(self, request):
        serializer = ProductSerializer(data=request.data)
        if serializer.is_valid():
            return Response("Valid serializer", status=status.HTTP_201_CREATED)
        return Response(
                            serializer.errors, 
                            status=status.HTTP_400_BAD_REQUEST
                        )

但是当我尝试这个时,我收到了这个错误。

Exception Value: 'NotImplementedType' object is not callable

如何使用django rest framework

在数据库中保存base64文件

1 个答案:

答案 0 :(得分:1)

正如drf-extra-fields docs所说:

  

您必须提供此类的您自己的完整实现。您必须在get_file_extension方法中实施文件验证并设置ALLOWED_TYPES列表。

您使用默认Base64FileField,这就是您收到的原因:

Exception Value: 'NotImplementedType' object is not callable

在这种情况下,您需要扩展默认Base64FileField并创建自定义字段以及验证方法get_file_extension并将ALLOWED_TYPES列表设置为属性。

直接来自文档的示例:

class PDFBase64File(Base64FileField):
    ALLOWED_TYPES = ['pdf']

    def get_file_extension(self, filename, decoded_file):
        try:
            PyPDF2.PdfFileReader(io.BytesIO(decoded_file))
        except PyPDF2.utils.PdfReadError as e:
            logger.warning(e)
        else:
            return 'pdf'

这是PDF个文件的字段。然后在您的ProductSerializer中,您可以使用新字段:file = PDFBase64FileField()