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

