{'user': ['Это поле обязательно.']} в django при выполнении post-запроса от клиента python

Я пытаюсь зарегистрировать читателя (расширенная модель django User), делая пост-запрос от клиента python. Я предоставил данные пользователя при выполнении post-запроса от python-клиента в 'reader-register'. Тем не менее, я получаю эту ошибку: {'user': ['This field is required.']}. Но это прекрасно работает из просматриваемого API фреймворка django rest framework.

Вот соответствующие коды.

class ReaderSerializer(serializers.ModelSerializer):
user = UserSerializer(required=True)

class Meta:
    model = Reader
    fields = ['user', 'photo_url', 'bio']

def create(self, validated_data):
    print(self.initial_data)
    user_data = validated_data.pop('user')
    user = User.objects.create(**user_data)
    reader = Reader.objects.create(user=user, **validated_data)
    return reader

def update(self, instance, validated_data):
    user_data = validated_data.pop('user')
    user = instance.user
    user.username = user_data.get('username', user.username)
    user.email = user_data.get('email', user.email)
    user.first_name = user_data.get('first_name', user.first_name)
    user.last_name = user_data.get('last_name', user.last_name)
    user.save()
    instance.photo_url = validated_data.get(
        'photo_url', instance.photo_url)
    instance.bio = validated_data.get('bio', instance.bio)
    instance.save()
    return instance

UserSerializer

class UserSerializer(serializers.ModelSerializer):
email = serializers.EmailField(
    required=True,
    validators=[UniqueValidator(queryset=User.objects.all())]
)

class Meta:
    model = User
    fields = ['username', 'password',
              'email', 'first_name', 'last_name']
    extra_kwargs = {
        'password': {
            'write_only': True,
            'required': True,
        },
        'first_name': {
            'required': True,
        },
        'last_name': {
            'required': True,
        },
        'username': {
            'required': True,
        },
    }

APIView

class ReaderRegisterAPIView(CreateAPIView):
serializer_class = ReaderSerializer
permission_classes = [AllowAny]

python клиент

import requests
data = {
"user": {
    "username": "a",
    "email": "test@gmail.com",
    "first_name": "test",
    "last_name": "test",
    "password": "a"
},
"photo_url": "",
"bio": ""
}


endpoint = 'http://localhost:8000/api/reader/register/'
response = requests.post(endpoint, data=data)

Что я здесь упускаю?

Отправьте запрос с параметром json:

data = {...}
response = requests.post(endpoint, json=data)

Django REST Framework по умолчанию принимает application/json в качестве content-type, а параметр data отправляет тело в виде application/x-www-form-urlencoded

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