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

Django序列化器提交空assigned_facilities触发KeyError的解决方法

问题:嵌套序列化器字段未提交时触发KeyError

给序列化器的嵌套字段assigned_facilities设置了required=False、allow_null=True,但提交表单时不填写该字段会返回KeyError。尝试添加else语句无效,调试显示错误出在create方法的第二行,请问如何在该字段无提交数据时跳过相关处理?

原代码:

def create(self, validated_data):
    assigned_facilities = validated_data.pop("assigned_facilities")
    instance = Lead.objects.create(**validated_data)

    for item in assigned_facilities:
        instance.leadfacility.create(**item)

    else:
        print("No Facilities Added!")
            
    return instance

解决方案

问题根源是直接调用validated_data.pop("assigned_facilities"),当字典里没有这个键时,pop方法会抛出KeyError。给pop加个默认值参数就能解决这个问题:

修改后的代码:

def create(self, validated_data):
    # 若字段未提交,pop返回空列表,避免KeyError
    assigned_facilities = validated_data.pop("assigned_facilities", [])
    instance = Lead.objects.create(**validated_data)

    for item in assigned_facilities:
        instance.leadfacility.create(**item)

    # 无数据时打印提示(可选)
    if not assigned_facilities:
        print("No Facilities Added!")
            
    return instance

说明:

  • pop("assigned_facilities", []):指定默认值为[],当validated_data中没有该字段时,直接返回空列表,不会触发异常
  • 原代码的for-else逻辑是**当for循环正常结束(没有被break中断)**时执行else,和你想要的“无数据时提示”逻辑不匹配,改成判断列表是否为空更直观
  • 空列表会直接跳过for循环,自然就不会执行关联数据的创建操作,达到“无数据时跳过处理”的目的

内容的提问来源于stack exchange,提问作者Matthias

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 01:25:36