我意识到标题听起来很愚蠢,但我希望能够更改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
上的update
和GroupSerializer
方法,但没有任何变化。
最多,我希望GroupSerializer
只是验证数据中的组是否存在。
答案 0 :(得分:0)
我找到的最佳解决方案是使用PrimaryKeyRelatedField
并提供一个只读界面,我可以选择已存在的项目并将它们与对象关联。
可悲的是,有一个缺点是,现在在GET
类型视图中查看这些对象时,相关对象的详细信息不会显示,而只会显示PK
。我将很快找到解决方法,也许多序列化器视图集可以解决这个问题。
答案 1 :(得分:0)
答案很晚,但我在StackOverflow的另一个帖子中偶然发现了这个问题(遗憾的是我现在无法找到),他们提到了以下discussion。
我使用的解决方案是创建两个序列化程序 - 一个用于读取,另一个用于写入 - 以及两个相应的ViewSets,包括正确的Mixins。所以我可以在使用GET方法时列出嵌套的外键,并且只使用现有的FK关系模型的标识符来POST。我使用了depth
属性。我希望这与这个问题有关。