Сериализаторы 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