Privacy Policy
Snippets index

  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"
    },
    ...
}