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

DRF嵌套序列化器创建报错:Ingredient不接受'dish'关键字参数

解决DRF序列化器create方法里的"意外关键字参数"错误

嘿,这个报错原因其实很直白:你的Ingredient模型里外键字段叫dish_id,但你创建实例的时候传的参数是dish,这俩名字不匹配,Django当然不认啦!

快速修复方案:

直接把创建Ingredient时的参数名改成dish_id就行,修改后的create方法代码如下:

def create(self, validated_data):
    ingredientInfo_data = validated_data.pop('ingredientInfo')
    # 这里提个小细节:你Meta里写的model是Menu,但这个序列化器是给Dish用的吧?如果是笔误记得改过来!
    dish = Dish.objects.create(**validated_data)
    for info in ingredientInfo_data:
        Ingredient.objects.create(**info, dish_id=dish)
    return dish

更规范的优化建议(推荐):

其实按照Django的命名习惯,外键字段一般直接用关联模型的小写名称,不用加_id(Django会自动在数据库里生成带_id的字段)。你可以把Ingredient模型的外键字段名改成dish,这样代码更简洁也更符合规范:

修改后的Ingredient模型:

class Ingredient(models.Model):
    dish = models.ForeignKey(Dish, on_delete=models.CASCADE, null=True, related_name='ingredientInfo')
    # 其他字段...

改完之后,你原来写的Ingredient.objects.create(**info, dish=dish)就能正常运行了,不用再改序列化器的代码~

另外再检查下DishSerializer的Meta类,你写的model = Menu,这应该是个笔误吧?毕竟序列化器叫DishSerializer,对应的模型应该是Dish才对,这个小问题也别忘了修正,不然后续可能会出其他奇怪的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 10:47:34