Как получить доступ к данным запроса, отправленным в виде формы-данных в рест-фреймворк Django
Я отправляю POST запрос с телом в виде FormData из моего flutter приложения в мой Django backend. В теле есть и MultiPart Files и String, но когда я пытаюсь получить доступ к данным в моем backend некоторые из них не доступны. Вот мой код :
flutter form-data body
FormData form = FormData({
"mobile_number": supplierMobileController.text,
"password": supplierPasswordController.text,
"firebase_token": "123456789",
"main_user": {
"username": supplierMobileController.text,
"password": "123456789"
},
"client_object": null,
"supplier_object": {
"personal_name": supplierPersonalNameController.text,
"company_name": supplierCompanyNameController.text,
"email": supplierEmailController.text,
"established": supplierMonthController.text.length == 2
? "${supplierYearController.text}-${supplierMonthController.text}-01"
: "${supplierYearController.text}-0${supplierMonthController.text}-01",
"number_of_projects": supplierNumberOfProjectsController.text,
"tax_id": MultipartFile(File(imageOne.value),
filename: "${supplierCompanyNameController.text}_tax_image.png"),
"company_logo": MultipartFile(File(imageTwo.value),
filename: "${supplierCompanyNameController.text}_logo_image.png"),
"business_register": MultipartFile(File(imageThree.value),
filename:
"${supplierCompanyNameController.text}_business_image.png"),
"company_text": ""
},
});
и вот как я пытаюсь получить доступ к этим данным в бэкенде :
Django Backend function
@permission_classes(["AllowAny"])
@parser_classes(["JSONParser"])
@api_view(['POST'])
def create_new_supplier(request):
'''
Handles API call to create a new supplier
'''
data = {}
if request.method == 'POST':
main_user_serializer = MainUserSerializer(data=request.data['main_user']) # causes an error
main_user_serializer.is_valid(True)
main_user_data = main_user_serializer.data
app_user_serializer = AppUserSerializer(data=request.data)
app_user_serializer.is_valid(True)
validated_data = app_user_serializer.data
supplier_serializer = models.Supplier(data=request.data['supplier_object'])
supplier_serializer.is_valid(True)
supplier_object_data = supplier_serializer.data
main_user_object = User.objects.create_user(**main_user_data)
app_user = models.AppUser.objects.create(**validated_data)
token_object = Token.objects.create(user=main_user_object)
supplier_object = models.Supplier.objects.create(**supplier_object_data)
app_user.token = token_object
app_user.client_object = None
app_user.supplier_object = supplier_object
app_user.main_user = main_user_object
app_user.is_active = False
app_user.save()
data = {
"success" : True,
"details":AppUserSerializer(app_user).data,
}
return Response(data, headers=get_headers())
строка main_user_serializer = MainUserSerializer(data=request.data['main_user']) вызывает эту ошибку :
raise MultiValueDictKeyError(key)
django.utils.datastructures.MultiValueDictKeyError: 'main_user'
Рекомендуется отправлять данные, представляющие собой словарь
"main_user": json.encode({
"username": supplierMobileController.text,
"password": "123456789"
}),
а в обратную сторону лучше получать данные так
main_user_serializer=MainUserSerializer(data=json.loads(request.data.get('equipo')))