Serializer.is_valid возвращает false с ошибкой, что поле является обязательным, хотя я передаю его

Я создаю сериализатор, чтобы при отправке сообщения с помощью следующей команды curl -d '{"food": "test", "portion": 12}' http://127.0.0.1:8000/food он будет сохранен в базу данных. Однако моя проблема в том, что serializer.is_valid() возвращает false с ошибкой, что поле "food" является обязательным, хотя я передаю его. Я не могу изменить команду curl, так как я могу заставить ее работать? Любая помощь будет принята с благодарностью.

views.py

serializer = StockSerializer(data=request.data)
if serializer.is_valid():
     //save
else:
    print(serializer.errors) //{'food': [ErrorDetail(string='This field is required.', code='required')]}

serializer.py

class FoodSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = ["food", "portion"]

Log

FoodSerializer(data=<QueryDict: {'{"food": "test", "portion": 12}': ['']}>):
    food = CharField(max_length=8)
    portion = IntegerField(required=False)

Если вы работаете с JSON блобом, вам нужно обрабатывать data, а не request.data, так как request.data работает так, как будто вы передаете данные с www-form-urlencode:

class FoodAPIView(APIView):
    def post(self, request):
        try:
            data = json.loads(request.body)
        except:
            return Response({"message": "ERROR DETECT"})
        #      use data, not request.data ↓
        serializer = FoodSerializer(data=data)
        if serializer.is_valid():
            serializer.save()
        else:
            print(serializer.errors)
            return Response({'message': 'ERROR DETECT'})

Вам также следует сделать POST запрос и использовать application/json в качестве типа содержимого, и таким образом проверить это с помощью:

#        ↓ POST request            ↓ JSON content type
curl -X POST -H 'Content-Type: application/json' -d '{"food": "test", "portion": 12}' http://127.0.0.1:8000/food
Вернуться на верх