[Django]-Receive a Base64 encoded image in Django Rest Framework and save into ImageField

26πŸ‘

Here is how you can handle a Base64 encoded image file in a post request at the Django-based (drf also) API end which saves it as an ImageField.

Let say you have a Model as follows:

class MyImageModel(models.Model):
      image = models.ImageField(upload_to = 'geo_entity_pic')
      data=model.CharField()

So the Corresponding Serializer would be as follows:

 from drf_extra_fields.fields import Base64ImageField

 class MyImageModelSerializer(serializers.ModelSerializers):
      image=Base64ImageField() # From DRF Extra Fields
      class Meta:
         model=MyImageModel
         fields= ('data','image')
      def create(self, validated_data):
        image=validated_data.pop('image')
        data=validated_data.pop('data')
       return MyImageModel.objects.create(data=data,image=image)

The corresponding View can be as follows:

elif request.method == 'POST':
    serializer = MyImageModelSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=201)
    return Response(serializer.errors, status=400)

Notice In the Serializer I have used Implementation of Base64ImageField provided in the module django-extra-field

To install this module run the command

pip install django-extra-fields

Import the same and Done!

Send (via post method) your image as an Base64 encoded String in JSON object along with any other data you have.

πŸ‘€Nikhil

2πŸ‘

There could be two best locations, depending on your use-case:

  1. in your serializer you have the validate_X and transform_X methods you can override for your field (see the validation docs) and to the conversion in both directions here.

  2. write your own custom field if you need the feature more often. You only have to define how the conversions run in both directions in to_native and from_native. Perhaps extend the original DRF ImageField to keep the image-data validation with PIL.

Update DRF3:

transform_X methods replaced by to_representation(). See removal-of-transform_field_name and Overriding serialization and deserialization behavior
.

Also have a look at this DRF Base64ImageFieldMixin example.

πŸ‘€Denis Cornehl

2πŸ‘

Try django extra fields. Use Base64ImageField as a serializer field assuming of course you used an ImageField in your models.

πŸ‘€CuriousGeorge

0πŸ‘

You can add this field type in your serializer

class YourModelSerilizer(serializers.Serializer):
    image_field = Base64ImageField()

Here is the proper guideline

Leave a comment