修改DRF中的只读嵌套字段

时间:2016-08-31 05:41:45

标签: django python-3.x django-rest-framework

我意识到标题听起来很愚蠢,但我希望能够更改Group个实例的User个对象的引用。但我不希望他们能够创建新组或编辑现有组。我想我想要的是一个只读的嵌套字段。但是,如果我将其设置为read_only=True,我不会在序列化程序验证数据中获取数据。如果我将其设置为read_only=False,那么它会尝试创建新的Group,而不是仅仅更改引用。

class GroupSerializer(serializers.ModelSerializer):
    permissions = PermissionSerializer(many=True)

    class Meta:
        model = Group
        fields = (
            'pk',
            'name',
            'permissions',
        )

class UserSerializer(serializers.ModelSerializer):
    groups = GroupSerializer(many=True)
    ....

    class Meta:
        model = User
        exclude = (
            ....
        )

    def update(self, instance, validated_data):
        print(validated_data)
        return instance

    def validate_groups(self, value):
        print("validating groups")
        ....
        return value

read_only=True根本没有任何事情发生。我让用户回到我的PATCH请求,但用户完全相同。使用read_only=False我收到了验证错误{'groups': [{'name': ['group with this name already exists.']}]}

我还尝试覆盖create上的updateGroupSerializer方法,但没有任何变化。

最多,我希望GroupSerializer只是验证数据中的组是否存在。

2 个答案:

答案 0 :(得分:0)

我找到的最佳解决方案是使用PrimaryKeyRelatedField并提供一个只读界面,我可以选择已存在的项目并将它们与对象关联。

可悲的是,有一个缺点是,现在在GET类型视图中查看这些对象时,相关对象的详细信息不会显示,而只会显示PK。我将很快找到解决方法,也许多序列化器视图集可以解决这个问题。

Here are the docs

答案 1 :(得分:0)

答案很晚,但我在StackOverflow的另一个帖子中偶然发现了这个问题(遗憾的是我现在无法找到),他们提到了以下discussion

我使用的解决方案是创建两个序列化程序 - 一个用于读取,另一个用于写入 - 以及两个相应的ViewSets,包括正确的Mixins。所以我可以在使用GET方法时列出嵌套的外键,并且只使用现有的FK关系模型的标识符来POST。我使用了depth属性。我希望这与这个问题有关。