Сериализаторы DFR против форм, и обработка ImageField() как необязательного поля, проблема не работает

Моя цель - как сделать ImageField() необязательным в случае, если пользователь не хочет отправлять изображение.

Когда я использую django Forms, то ImageField() будет работать нормально, где поле будет рассматриваться как необязательное. В то время как, когда я использую Django "class FleetSerializer(serializers.ModelSerializer):", то ImageField() не будет рассматриваться как необязательное.

.

Есть ли решение для этой моей огромной проблемы? Спасибо миллион.

Вот полный код: MODELS, SERIALIZERS, VIEWS, где моя цель - иметь REST API с полем 'licRegImage' как опциональным. Этот код предназначен для фронтенда Flutter/Dart, поэтому я предпочитаю использовать SERIALIZERS.

.

Вот уже более двух недель я не могу найти решение. Я подозреваю, что это может быть связано с проблемами совместимости или худшими ошибками.

  • Из файла 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
  • и т.д., и т.п.

МОДЕЛИ:


                
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

СЕРИАЛИЗАТОРЫ:


    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},
        }

ПРОСМОТРОВ:


    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)   

когда вы работаете с django rest framework, он ожидает изображение как файл base64

поэтому вы можете использовать django-extra-fields lib для преобразования изображения в base64 и его хранения

django-extra-fields reference

Вернуться на верх