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