FileField serializer for django-rest-framework ¶
from __future__ import unicode_literals import os import base64 from rest_framework import serializers from django.core.files.base import ContentFile # Note that SerializerMethodField is read-only #class FileFieldSerializer(serializers.SerializerMethodField): class FileFieldSerializer(serializers.Field): """ Serializes a FileFile as 'filename' + base64-encoded data. Sample usage: class MySerializer(serializers.ModelSerializer): attachment = FileFieldSerializer(allow_null = True) ... """ def to_representation(self, value): # when deriving from serializers.SerializerMethodField, use: # filefield = getattr(value, self.field_name) filefield = value if bool(filefield): data = { 'filename': os.path.split(filefield.name)[-1], 'data': filefield.file.read().encode('base64'), } else: data = None return data def to_internal_value(self, data): content_file = ContentFile( base64.b64decode(data['data']), name=data['filename'] ) return content_file
Sample result:
HTTP 200 OK Content-Type: application/json Vary: Accept Allow: GET, PUT, DELETE, HEAD, OPTIONS { "id": "1392ef6b-70b9-4e77-a3c7-9b3b1105685a", "attachment": { "data": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz ... AAAAASUVORK5CYII=\n", "filename": "000010-monitor.png" }, ... }