Serializer返回200但未将数据保存至数据库问题排查
问题分析与解决方案
核心问题
- 视图逻辑错误:
create_order方法里调用self.get_object()获取现有实例,导致序列化器执行更新操作而非创建新订单——你以为是新增记录,但实际只是修改了已存在的对象,自然不会在数据库里新增条目。 - 序列化器字段设置错误:
user_name和book用了ReadOnlyField,这类字段仅用于序列化输出,不支持反序列化写入,POST请求里的数据根本不会被写入数据库。
修复步骤
1. 修正视图层代码
创建订单不需要获取现有实例,直接初始化序列化器时不传instance参数:
def create_order(self, request): # 移除get_object(),创建新订单不需要依赖现有对象 serializer = CreateOrderSerializer(data=request.data) serializer.is_valid(raise_exception=True) serializer.save() print(serializer.data) return Response(serializer.data)
2. 调整序列化器字段
假设你的order模型通过外键关联User(author字段)和Book模型,需要区分可写字段(用于接收前端数据)和只读字段(用于返回展示):
class CreateOrderSerializer(serializers.ModelSerializer): # 只读字段:仅用于返回数据时展示用户名和书名 user_name = serializers.ReadOnlyField(source="author.username") book_name = serializers.ReadOnlyField(source="book.name") # 假设Book模型有name字段 # 可写字段:接收前端传入的关联ID,用于写入数据库 author = serializers.PrimaryKeyRelatedField(queryset=User.objects.all()) book = serializers.PrimaryKeyRelatedField(queryset=Book.objects.all()) class Meta: model = order fields = ("id", "author", "book", "user_name", "book_name")
补充优化(可选)
如果希望自动用当前登录用户作为订单的author,可以在保存时直接传入,同时移除序列化器中的author字段,避免前端传入:
# 视图层修改 def create_order(self, request): serializer = CreateOrderSerializer(data=request.data) serializer.is_valid(raise_exception=True) # 自动传入当前登录用户 serializer.save(author=request.user) print(serializer.data) return Response(serializer.data) # 序列化器修改 class CreateOrderSerializer(serializers.ModelSerializer): user_name = serializers.ReadOnlyField(source="author.username") book_name = serializers.ReadOnlyField(source="book.name") book = serializers.PrimaryKeyRelatedField(queryset=Book.objects.all()) class Meta: model = order fields = ("id", "book", "user_name", "book_name")
内容的提问来源于stack exchange,提问作者Prog
相关产品推荐
相关产品推荐

