python - Django REST Framework 部分深度更新

标签 python django django-rest-framework

我正在尝试在应用程序中启用部分更新功能。我扩展了 django auth 用户模型以允许一些额外的用户数据;当我向 View 发送 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

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

最佳答案

这最初是在问题中回答的,但我觉得它值得一个像样的解释。

在 Django REST Framework 3 中,保存嵌套数据的过程已经变得更加清晰。现在,您可以覆盖序列化器上的 update 并操作 validated_data,手动更新模型对象。这是specifically documented now ,但实现通常是针对具体情况的。

<小时/>

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

Short answer is yes, it's possible. The problem was that I still needed to override the .save() method on my model to also save the related User object.

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)

关于python - Django REST Framework 部分深度更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18452635/

相关文章:

python - cloudml 重新训练初始 - 收到的标签值超出有效范围

python - 如何使用 pyarrow 从 S3 读取 Parquet 文件列表作为 Pandas 数据框?

jquery - 具有验证和多表单处理的 Django Ajax 提交

带有 Django MongoDB 引擎的 Django contrib.auth.models.User

python - Django Rest Framework - 如何将 kwargs 传递给 model.save()?

python - 来自时间序列数据框的 matplotlib

python - 对列表进行排序,使字母位于任何位置的数字之前

python - 分配 django 错误之前引用的局部变量

python - 如何从 Django rest 框架的序列化程序中获取特定字段

django - 将 Django 过滤器集应用于带注释的查询集?