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
相关产品推荐
相关产品推荐

