2017-08-19 98 views
0

我該如何處理django rest框架中的base64文件字段。我使用django額外的字段,但它不工作。django rest框架保存base64文件

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框架

回答

1

正如drf-extra-fields docs說我保存的base64文件中的數據庫:

你必須提供這個類的自己的全面實施。您必須在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()

+0

文件格式將像docs,pdf或圖像一樣。那麼,如何處理這個 – Thameem

+1

@Thameem首先,設置'ALLOWED_TYPES =( 'PDF', '文檔', 'DOCX', 'JPEG', 'JPG', 'PNG',...)'和任何擴展你想。然後,在你的'get_file_extension'方法中執行驗證。您已經擁有PDF驗證功能,由您來實施其他功能。 – wencakisa

+0

@wencaksis請問我可以用一種方法來驗證jpeg和pdf。我怎樣才能做到這一點。 – Thameem