DFR Serializers vs. Forms, and handling of ImageField() as optional field, problem not working

43 views Asked by At

My target is how to make ImageField() as optional in case user does not want to submit an image.

When I use django Forms, then the ImageField() will work fine where the field will be treated as optional. Whereas, when I use Django "class FleetSerializer(serializers.ModelSerializer):" then the ImageField() will not be treated as optional.

Any solution for this huge problem of mine? Thanks a million.

Here is the complete code: MODELS, SERIALIZERS, VIEWS where my objective is to have REST API with field 'licRegImage' as optional. This code is aimed towards Flutter/Dart frontend why I prefer to use SERIALIZERS.

For over two weeks now I have not been able to find a solution. I suspect it may be related to compatibility issues, or worst bugs.

  • From Requirements.txt:
  • Django==3.2.16
  • djangorestframework==3.13.1
  • djongo==1.3.6
  • pymongo==3.12.1
  • djangorestframework==3.13.1
  • Pillow==9.2.0
  • etc., etc.

MODELS:


                
from djongo import models

class Fleet(models.Model): 

    usrRegId      = models.CharField(max_length=28)
    fleetId       = models.CharField(max_length=13)
    vinNr         = models.CharField(max_length=35)
    licRegNr      = models.CharField(max_length=35)
    licRegExpire  = models.CharField(max_length=10)
    licRegImage   = models.ImageField(null=True, blank=True, upload_to='astfleet/imglicReg/', default = 'sys_global/images/no_image.png')

    objects       = models.DjongoManager()
    class Meta:
        db_table = "ast_fleet"

    
    def __str__(self):
        return self.usrRegId

SERIALIZERS:


    class FleetRegistrationSerializer(serializers.ModelSerializer):
    class Meta:
        model   = Fleet
        fields  =(
            'usrRegId',
            'fleetId',
            'vinNr',
            'licRegNr',
            'licRegExpire',
            'licRegImage',
        )

        extra_kwargs = {
            'usrRegId':{'write_only':True},
            'fleetId':{'write_only':True},
            'licRegImage':{'required':False},
        }

VIEWS:


    class astFleetRegistration(APIView):
    permission_classes = [IsAuthenticated]  
    
    def post(self, request):

        newFleet = {                
            'usrRegId'     : request.user.usrRegId,
            'fleetId'      : fleetId_new,
            'vinNr'        : request.data['vinNr'],
            'licRegNr'     : request.data['licRegNr'],
            'licRegExpire' : request.data['licRegExpire'],
            'licRegImage'  : request.data['licRegImage'],
            }

        serializers = FleetRegistrationSerializer(data=newFleet)

        if serializers.is_valid():
            serializers.save()
            
            getResponse       = {'SUCCESS'  : 0, 
                                'MESSAGE'  : 'New fleet was successfully registered',
                                'ACTION'   : 'Check your Email for details',
                                'DATA'     : [serializers.data]}
            return JsonResponse(getResponse, status=status.HTTP_200_OK, safe=False)

        getResponse = { 'SUCCESS'   : 1, 
                        'MESSAGE'   : 'Input cannot be serialized',
                        'ACTION'    : 'Please check your input and submit again'} 
        return JsonResponse(getResponse, status=status.HTTP_400_BAD_REQUEST)   
1

There are 1 answers

4
Hashem On

when you work with django rest framework it expect image as base64 file

so you can use django-extra-fields lib to convert image to base64 and store it

django-extra-fields reference