Как написать сериализатор DRF для обработки оболочек JSON, охватывающих поля данных, определенные в моих моделях? - PullRequest
0 голосов
/ 31 декабря 2018

Я пишу REST API с использованием Django Rest Framework, и мне нужно знать, как написать сериализатор для обработки этого запроса json

{
    "user_form": {
        "fields": [
            {"email": "tom.finet@hotmail.co.uk"},
            {"password": "password"},
            {"profile": {
                "username": "Tom Finet",
                "bio": "I like running, a lot.",
                "location": "Switzerland"
            }}
        ]
    }
}

Модели существуют как для объектов User, так и для объектов Profile, поэтому я используюModelSerializer для упрощения сериализации.Однако соответствующие данные пользователя и профиля помещаются в конверты user_form и fields.Поэтому, когда я делаю запрос POST для создания пользователя, сервер выдает код состояния 400 с BadRequest.

Вот сериализаторы пользователя и профиля

class ProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = '__all__'

class UserSerializer(serializers.ModelSerializer):
    profile = ProfileSerializer()

    class Meta:
        model = User
        fields = ('email', 'password', 'profile')

    def create(self, validated_data):
        email_data = validated_data.pop('email')
        password_data = validated_data.pop('password')
        created, user = User.objects.get_or_create_user(
            email=email_data,
            password=password_data
        )
        return user

Здесьтакое представление создания API:

def create(self, request):
    user_serializer = UserSerializer(data=request.data)
    if user_serializer.is_valid(raise_exception=True):
        user_serializer.save()
    return Response(
        user_serializer.data,
        status=status.HTTP_201_CREATED
    )

Я хочу, чтобы сериализаторы создали пользователя по указанному запросу json, но я не знаю, как поступить с конвертами, обертывающими пользователя, иданные профиля.

1 Ответ

0 голосов
/ 31 декабря 2018

Исходя из моего комментария,

Рассмотрите возможность изменения полезной нагрузки поста (на стороне клиента) следующим образом:

{
    "email": "tom.finet@hotmail.co.uk",
    "password": "password",
    "profile": {
        "username": "Tom Finet",
        "bio": "I like running, a lot.",
        "location": "Switzerland"
    }
}

После этого достаточно текущих классов сериализатора.

Если невозможно изменить полезную нагрузку после записи на клиенте, рассмотрите возможность ее экстраполяции, используя следующее понимание, чтобы создать экземпляр сериализатора вручную в вашем представлении:

serializer = UserSerializer(data={
    k: v
    for d in request.data.get('user_form').get('fields')
    for k, v in d.items()
})

if not serializer.is_valid():
    # handle invalid serializer error
    pass

# save the new model
serializer.save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...