1

我正在尝试在应用程序中启用部分更新功能。我扩展了 django auth 用户模型以允许一些额外的用户数据;当我向视图发送 PATCH 请求(扩展rest_framework.generics.RetrieveUpdateAPIView)时,会收到正确的数据,但它似乎忽略了嵌套数据。例子:

{'id': 1, 'foo': 'bar', 'baz': 'qux', 'user': {'username': 'user1', 'first_name': 'User', 'last_name': 'One'}}

foobaz已正确更新,但usernamefirst_namelast_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

谁能告诉我部分更新是否支持深度,如果是,我可能做错了什么?

4

1 回答 1

1

这最初是在问题中回答的,但我觉得它应该得到一个体面的解释。

在 Django REST Framework 3中,保存嵌套数据的过程变得更加清晰。现在您可以覆盖update序列化程序并validated_data手动更新您的模型对象。现在专门记录了这一点,但实施通常非常具体地针对具体情况。


user2708386的原始答案(在问题中)

简短的回答是肯定的,这是可能的。问题是我仍然需要覆盖 .save()模型上的方法来保存相关的用户对象。

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)
于 2014-12-20T21:28:28.907 回答