如何在Django Rest框架中正确更新用户和配置文件?

时间:2019-11-25 05:20:39

标签: django django-rest-framework

这里我正在尝试更新用户和用户配置文件模型。这将更新用户,但是与此有关的一个问题是:如果我不提供地址或任何其他字段,那么更新后它将变为空白。如何解决此问题? ?

如果我仅更新一个字段,则在更新时会使其他字段为空。如果用户不更新该字段,我想存储用户的先前数据

models.py

class Profile(models.Model):
    user = models.OneToOneField(get_user_model(),on_delete=models.CASCADE,related_name='profile')
    address = models.CharField(max_length=250,blank=True,null=True)

serializer.py

class UpdateUserSerializer(serializers.ModelSerializer):
    profile = ProfileSerializer()
    class Meta:
        model = get_user_model()
        fields = ['first_name', 'last_name', 'profile']

    def update(self, instance, validated_data):
        instance.username = validated_data.get('username', instance.username)
        instance.email = validated_data.get('email', instance.email)
        instance.first_name = validated_data.get('first_name', instance.first_name)
        instance.last_name = validated_data.get('last_name', instance.last_name)
        instance.save()
        profile_data = validated_data.pop('profile')
        instance.profile.address = profile_data.get('address', instance.profile.address)
        instance.profile.save()

        return instance

views.py

class UpdateUser(generics.UpdateAPIView):
    serializer_class = UpdateUserSerializer
    queryset = get_user_model().objects.all()

1 个答案:

答案 0 :(得分:0)

您正在使用参数中的值覆盖更新时的模型实例字段。如果没有相应的参数,则将获得空字符串作为值。

DRF附带了已经实现的逻辑。您只需要处理profile数据。将serializers.py更改为:

class UpdateUserSerializer(serializers.ModelSerializer):
    profile = ProfileSerializer()
    class Meta:
        model = get_user_model()
        fields = ['first_name', 'last_name', 'profile']

    def update(self, instance, validated_data):
        # We try to get profile data
        profile_data = validated_data.pop('profile', None)
        # If we have one
        if profile_data is not None:
            # We set address, assuming that you always set address
            # if you provide profile
            instance.profile.address = profile_data['address']
            # And save profile
            instance.profile.save()
        # Rest will be handled by DRF
        return super().update(instance, validated_data)

确保使用PATCH请求,因为PUT用于整个实例更新。 PATCH用于部分实例更新。