【问题标题】:Modify read only nested fields in DRF修改 DRF 中的只读嵌套字段
【发布时间】:2017-01-07 13:38:23
【问题描述】:

我意识到标题听起来很傻,但我希望能够为我的 User 实例更改对 Group 对象的引用。但我不希望他们能够创建新组或编辑现有组。我想我想要的是一个只读的嵌套字段。但是,如果我将其设置为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.']}]}

我也尝试过覆盖GroupSerializer 上的createupdate 方法,但没有任何变化。

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

【问题讨论】:

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


【解决方案1】:

答案真的很晚,但我在 StackOverflow 上的另一个帖子中偶然发现了这个问题(不幸的是我现在找不到它),他们提到了以下 discussion

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

【讨论】:

    【解决方案2】:

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

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

    Here are the docs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      • 2021-07-08
      • 2021-09-24
      • 2021-12-13
      • 2018-09-13
      • 1970-01-01
      相关资源
      最近更新 更多