Reputation: 8337
I need to receive an image from an app, and the best way I can think of is to send it into a JSON array encoded in Base64. The image is very small so I don't care about the extra overhead.
I have a model :
class Observation(models.Model):
...
sonogram_image = models.ImageField(upload_to=sonogram_dir)
And its serialiser:
class ObsvSerializerNoDetect(serializers.HyperlinkedModelSerializer):
class Meta:
model = Observation
Where should I put the code to decode the image?
Upvotes: 24
Views: 20846
Reputation: 184
You can add this field type in your serializer
class YourModelSerilizer(serializers.Serializer):
image_field = Base64ImageField()
Upvotes: 0
Reputation: 1039
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.
Upvotes: 26
Reputation: 491
Try django extra fields
. Use Base64ImageField
as a serializer field assuming of course you used an ImageField
in your models.
Upvotes: 2
Reputation: 4182
There could be two best locations, depending on your use-case:
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.
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.
Upvotes: 2