Создание пользователя DRF с отношением один к одному - PullRequest
1 голос
/ 01 мая 2020

Я сделал модель и сериализаторы для пользователя и дополнительные для их профиля (дополнительная информация).

Модель

class Profile(models.Model):
    users = models.OneToOneField(
        User,
        on_delete=models.CASCADE,
        primary_key=True,
    )
    nickname = models.CharField(max_length=10, unique=True)
    bio = models.CharField(max_length=300)
    def __str__(self):
        return self.nickname

Сериализаторы

class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ['id', 'username']
class ProfileSerializer(serializers.HyperlinkedModelSerializer):
    users = UserSerializer()
    class Meta:
        model = Profile
        fields = ['users', 'nickname']

It отлично работает для отображения всего этого, но теперь я хочу сделать так, чтобы я мог создать новый User с запросом POST И также автоматически назначить новый пустой или стандартный Profile экземпляр для того же User. DRF не позволяет мне делать это напрямую из Profile модели API. Должен ли я создать функцию views.py, которая создаст пользователя, а также создать для него Profile отдельно или для этого есть встроенные методы, чтобы пользователь мог обновить их Profile?

1 Ответ

1 голос
/ 01 мая 2020

Вам просто нужно переопределить функцию создания вашего сериализатора. Кроме того, вам не нужны два сериализатора для этой цели. Нечто подобное сделает эту работу за вас, (измените в соответствии с вашими полями):

class UserSerializer(serializers.Serializer):
    """
    Serializer for user details
    """
    username = serializers.CharField()
    nickname = serializers.CharField()
    bio = serializers.CharField()
    first_name = serializers.CharField()
    last_name = serializers.CharField()
    email = serializers.CharField()
    password = serializers.CharField()

    def create(self, validated_data):
        user = User(
            username=validated_data["username"],
            email=validated_data["email"]
        )
        user.set_password(validated_data["password"])
        user_id = user.save()
        Profile.objects.create(
            user_id=user.id,
            nickname=validated_data["nickname"],
            bio=validated_data["bio"]
        )
        return validated_data
...