这里我正在尝试更新用户和用户配置文件模型。这将更新用户,但是与此有关的一个问题是:如果我不提供地址或任何其他字段,那么更新后它将变为空白。如何解决此问题? ?
如果我仅更新一个字段,则在更新时会使其他字段为空。如果用户不更新该字段,我想存储用户的先前数据
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()
答案 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
用于部分实例更新。