Сохранить два экземпляра модели в одном обновлении - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь обновить модель User и модель UserProfile в одном представлении, но это не работает. Ошибка не отображается и не вносятся изменения в объекты. Что я не правильно делаю. Вот мой models.py:

class UserProfile(models.Model):
    """User information not related to authentication"""
    user = models.OneToOneField(User, related_name='user_profile', on_delete=models.CASCADE)
    age = models.IntegerField()
    # other fields ignored

Вот мой serializer.py:

class UserSerializer(ModelSerializer):
    first_name = CharField(max_length=20)
    last_name = CharField(max_length=20)
    email = EmailField(required=True, validators=[UniqueValidator(queryset=User.objects.all())])
    username = CharField(max_length=32,validators=[UniqueValidator(queryset=User.objects.all())])
    password = CharField(min_length=8, write_only=True)
    confirm_password = CharField(write_only=True)


    def create(self, validated_data):
        user = User.objects.create_user(
            validated_data['username'],
            email = validated_data['email'],
            first_name = validated_data['first_name'],
            last_name = validated_data['last_name']
            )
        password = validated_data['password']
        confirm_password = validated_data['confirm_password']

        if password != confirm_password:
            raise ValidationError({'password': 'Passwords must match'})
        else:
            user.set_password(password)
            user.save()
            return user

    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name', 'email', 'password', 'confirm_password')
class UserProfileSerializer(ModelSerializer):
    username = CharField(source='user.username')
    first_name = CharField(source='user.first_name')
    last_name = CharField(source='user.last_name')
    email = CharField(source='user.email')

    class Meta:
        model = UserProfile
        exclude = ('user',)
        # fields = '__all__'
        # depth = 1

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

Вот view.py:

class UserProfileUpdate(UpdateAPIView):
    queryset = UserProfile.objects.all()
    serializer_class = UserProfileSerializer
    lookup_field = 'user'

1 Ответ

1 голос
/ 14 октября 2019

@ Эрик Попробуйте изменить способ обновления на этот, фактические данные обновления находятся под validated_data['user']

 def update(self, instance, validated_data):
        user = instance.user
        instance.user.username = validated_data['user'].get('username', instance.user.username)
        instance.user.email = validated_data['user'].get('email', instance.user.email)
        instance.user.first_name = validated_data['user'].get('first_name', instance.user.first_name)
        instance.user.last_name = validated_data['user'].get('last_name', instance.user.last_name)
        instance.save()
        user.save()
        return instance
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...