Angular8+Django3:同时保存Recipe与关联Ingredients对象的问题
这个问题我之前也碰到过,Django REST Framework 默认的 ModelSerializer.create() 确实不支持直接处理可写的嵌套关联字段,报错信息已经说得很明确了——我们需要自己实现 create() 方法来手动处理 Recipe 和关联 Ingredients 的创建逻辑。
下面一步步来修改解决:
1. 修改序列化器,实现自定义创建逻辑
首先调整你的 RecipeFullSerializer:先移除 ingredients 字段的 read_only=True(不然序列化器会忽略传入的配料数据),然后重写 create 方法来分步创建主对象和关联对象:
class RecipeFullSerializer(serializers.ModelSerializer): ingredients = IngredientSerializer(many=True) # 移除read_only=True,允许写入 class Meta: model = Recipe fields = ['name', 'ingredients'] def create(self, validated_data): # 先从验证后的数据中分离出配料列表,剩下的是Recipe的字段数据 ingredients_data = validated_data.pop('ingredients') # 创建Recipe主对象 recipe = Recipe.objects.create(**validated_data) # 循环创建每个配料,关联到刚生成的Recipe for ingredient_data in ingredients_data: Ingredients.objects.create(recipe=recipe, **ingredient_data) # 返回创建完成的Recipe对象 return recipe
如果你的配料数量较多,用 bulk_create 会更高效(减少数据库交互次数),可以把循环创建的部分替换成:
Ingredients.objects.bulk_create( [Ingredients(recipe=recipe, **data) for data in ingredients_data] )
2. 视图无需改动
你的 AddRecipe 类视图不用做任何调整——CreateAPIView 会自动调用我们重写后的序列化器 create() 方法,现在就能同时保存 Recipe 和它的关联配料了。
最后确认下前端提交的数据格式(就是你给出的结构)是正确的,这样后端就能顺利解析并处理嵌套的配料数据啦。
内容的提问来源于stack exchange,提问作者ratrace123
相关产品推荐
相关产品推荐

