我正在尝试在应用中启用部分更新功能。我已经扩展了django auth用户模型以允许一些额外的用户数据;当我向视图发送PATCH请求(扩展rest_framework.generics.RetrieveUpdateAPIView
)时,会收到正确的数据,但它似乎忽略了嵌套数据。例如:
{'id': 1, 'foo': 'bar', 'baz': 'qux', 'user': {'username': 'user1', 'first_name': 'User', 'last_name': 'One'}}
foo
和baz
已正确更新,但username
,first_name
和last_name
均已被忽略。
class UserProfileSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username', 'first_name', 'last_name')
class UsersSerializer(serializers.ModelSerializer):
user = UserProfileSerializer(many=False, read_only=False, partial=True)
class Meta:
model = Users
fields = ('id', 'foo', 'baz', 'yin', 'yang', 'user')
depth = 1
class UserProfileGenericAPIView(generics.GenericAPIView):
serializer_class = UsersSerializer
queryset = Users.objects.all()
def pre_save(self, obj):
pass
class UserProfileView(UserinfoGenericAPIView, generics.RetrieveUpdateAPIView):
pass
有人可以告诉我,部分更新是否支持深度,如果是,我可能做错了什么?
答案 0 :(得分:1)
这最初是在问题中回答的,但我觉得它应该得到一个不错的解释。
在Django REST Framework 3 中,保存嵌套数据的过程变得更加清晰。现在,您可以覆盖序列化程序上的update
并操纵validated_data
,手动更新模型对象。这是specifically documented now,但实施通常非常具体。
简短回答是肯定的,这是可能的。问题是我仍然需要覆盖 我的模型上的
.save()
方法也保存了相关的User对象。
class Users(models.Model):
user = models.OneToOneField(User)
foo = models.CharField()
baz = models.CharField()
yin = models.CharField()
yang = models.CharField()
def save(self, *args, **kwargs):
user_ = self.user
user_.save(update_fields=('username', 'first_name', 'last_name'), **kwargs)
return super(Users, self).save(*args, **kwargs)