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.
2
There could be two best locations, depending on your use-case:
-
in your serializer you have the
validate_X
andtransform_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
andfrom_native
. Perhaps extend the original DRFImageField
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.
- [Django]-Getting next and previous objects in Django
- [Django]-How do I test Django QuerySets are equal?
- [Django]-Supervising virtualenv django app via supervisor
2
Try django extra fields
. Use Base64ImageField
as a serializer field assuming of course you used an ImageField
in your models.
- [Django]-How to use Star rating of Font-awesome with Django?
- [Django]-How to exclude two conditions in query via Django ORM?
- [Django]-How to check current user's permissions from a Group in Django?
0
You can add this field type in your serializer
class YourModelSerilizer(serializers.Serializer):
image_field = Base64ImageField()
- [Django]-Localized date strftime in Django view
- [Django]-How to PATCH a single field using Django Rest Framework?
- [Django]-ImportError: No module named django_extensions