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

Serializer返回200但未将数据保存至数据库问题排查

问题分析与解决方案

核心问题

  1. 视图逻辑错误:create_order方法里调用self.get_object()获取现有实例,导致序列化器执行更新操作而非创建新订单——你以为是新增记录,但实际只是修改了已存在的对象,自然不会在数据库里新增条目。
  2. 序列化器字段设置错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 01:45:11