You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为子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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 18:05:03