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

Django将模型对象传入序列化器报错:AuthorUser类型不可JSON序列化

报错原因

你触发Object of type AuthorUser is not JSON serializable报错的核心原因是:将AuthorUser模型实例直接赋值给了request.data['author'],DRF默认的外键序列化规则无法直接将Python模型实例转换为JSON格式,同时直接修改request.data的写法本身不符合DRF的最佳实践。

而你直接传ID创建成功但返回只有author_id的原因是:ModelSerializer默认会将外键字段映射为PrimaryKeyRelatedField,序列化输出时只会返回外键的主键值,不会自动嵌套返回关联模型的完整信息。

解决方案

第一步:修正视图逻辑,避免修改request.data

DRF的序列化器支持在调用save()方法时传入额外的模型字段参数,不需要提前修改request.data,同时补充参数校验失败的异常处理、加查询优化避免N+1问题:

@api_view(['GET', 'POST'])
def articles(request):
    if request.method == 'GET':
        # select_related提前联表查author,避免循环查询
        articles = Article.objects.select_related('author').all()
        serializer = CreateArticleSerializer(articles, many=True)
        return Response(serializer.data)
    if request.method == 'POST':
        if not request.user.is_authenticated:
            return HttpResponse(status=401)
        serializer = CreateArticleSerializer(data=request.data)
        # 验证失败自动返回400错误
        serializer.is_valid(raise_exception=True)
        # 查作者实例,save时传入即可
        author = AuthorUser.objects.get(id=request.data['author'])
        serializer.save(author=author)
        return Response(serializer.data)

第二步:配置序列化器实现嵌套返回作者信息

首先创建AuthorUser的序列化器,用来定义作者字段的返回格式,再修改文章序列化器区分读写逻辑:

# 先定义作者序列化器,fields根据你实际需要返回的字段调整
class AuthorUserSerializer(serializers.ModelSerializer):
    class Meta:
        model = AuthorUser
        fields = ['id', 'username', 'email', 'avatar'] # 按需填字段

class CreateArticleSerializer(serializers.ModelSerializer):
    # 读操作返回完整的作者信息,设为只读
    author = AuthorUserSerializer(read_only=True)

    class Meta:
        model = Article
        # 写操作接收author的ID值,不需要额外定义字段,DRF会自动识别外键传参
        fields = ['title', 'body', 'author']

如果你的业务场景中,作者ID不需要前端传,而是直接取当前登录用户,还可以进一步简化,直接删掉请求参数里的author传参,视图里改为serializer.save(author=request.user)即可。


内容的提问来源于stack exchange,提问作者Been-H

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 12:18:03