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