如何为子ModelSerializer设置实例以实现更新操作?
嵌套一对一关联序列化器的更新校验问题
数据模型
class Parent: child = models.OneToOneField(Child) name = models.CharField() class Child: name = models.CharField()
请求载荷示例
{ "id": 1, "name": "Dad", "child": { "id": 2, "name": "Kiddo" } }
序列化器代码
class ParentSerializers(serializers.ModelSerializer): class Meta: model = Parent fields = ("child", "name") child = ChildSerializer() class ChildSerializer(serializers.ModelSerializer): class Meta: model = Child fields = ("name",)
视图代码
try: parent = Parent.objects.get(id=request.data["id"]) except Parent.DoesNotExist: parent = None serializer = ParentSerializer(data=request.data, instance=parent) serializer.is_valid(raise_exception=True)
问题描述
当Parent和Child实例已存在于数据库中时,传入上述请求会触发code=unique的ValidationError。原因是序列化器在“创建”模式下会校验主键唯一性,只有绑定到实例(“更新”模式)时才会跳过该校验。
目前已为ParentSerializer设置了instance=parent参数,但无法给嵌套的ChildSerializer设置对应实例。
临时解决方案
try: parent = Parent.objects.get(id=request.data["id"]) except Parent.DoesNotExist: parent = None serializer = ParentSerializer(data=request.data, instance=parent) if parent: try: serializer.fields.fields["child"].instance = parent.child except Child.DoesNotExist: pass serializer.is_valid(raise_exception=True)
内容的提问来源于stack exchange,提问作者foucdeg
相关产品推荐
相关产品推荐

