Как совместить две разные модели в модуле сериализаторов (Django)? - PullRequest
0 голосов
/ 04 ноября 2019

Я хочу создать API регистрации, в котором я хочу объединить модель пользователя и модель профиля, чтобы создать нового пользователя, добавив имя пользователя, адрес электронной почты, пароль (поля модели пользователя) и пол, зарплату, компанию,и адрес (поля модели профиля). Я попытался использовать источник по этой ссылке . Тем не менее, я не могу разместить любые данные. Это мой код:

views.py:

class RegisterAPIView(APIView):
    def post(self, request, format=None):
        serializer = ProfileSerializer(data=request.data)
        if serializer.is_valid():
             serializer.save()
             return Response("Thank you for registering", status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

serializers.py:

from rest_framework import serializers
from users.models import Profile
from django.contrib.auth.models import User

class ProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = ['gender', 'company', 'salary', 'address']

class RegisterBSerializer(serializers.ModelSerializer):   #User Model serializer
    profile = ProfileSerializer()

    class Meta:
        model = User
        fields = ['username', 'email', 'password']

    def create(self, validated_data):
        profile_data = validated_data.pop('profile')
        password = validated_data.pop('password', None)
        user = User.objects.create(**validated_data)
        if password is not None:
            user.set_password(password)
        user.save() 
        Profile.objects.create(user = user, **profile_data)
        return user

Может ли кто-нибудь намекнуть мне, куда я ухожу?

Я не могу добавить данные через DRF: image

Обычно я должен получатьТело, в котором говорится:

{"username" : "this field is required",
"email" : "this field is required",
"password" : "this field is required", (will be hashed using set_password())
"gender" : "this field is required",} etc etc...

1 Ответ

0 голосов
/ 04 ноября 2019

Вы можете сделать это, написав собственный to_representation метод, подобный этому

class RegisterBSerializer(serializers.ModelSerializer):   #User Model serializer
    profile = ProfileSerializer()

    class Meta:
        model = User
        fields = ['username', 'email', 'password']

    def to_representation(self, instance):
        data = super().to_representation(instance)
        profile = data.pop('profile', {})
        data.update(profile)
        return data
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...