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

如何在Django中通过序列化器实现关联表双向查询?

解决思路与修正代码

问题核心

你的代码存在两个关键问题:

  • many=True 参数误用:Blog和User是一对多关系,单篇Blog仅属于一个User,因此BlogSerializer里的user字段不能加many=True——这个参数是给一对多/多对多关系的「多」侧使用的。
  • 序列化器定义顺序冲突:BlogSerializer先定义,却引用了后面才出现的UserSerializer,Python解释器会直接报「未定义」错误。

修正方案

方案1:调整序列化器定义顺序

把UserSerializer放在BlogSerializer前面,确保引用时已完成定义,同时去掉错误的many=True参数:

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = "__all__"

    blog = BlogSerializer(many=True, read_only=True)

class BlogSerializer(serializers.ModelSerializer):
    class Meta:
        model = Blog
        fields = "__all__"
    
    user = UserSerializer(read_only=True)

方案2:用字符串引用序列化器(无需调整顺序)

如果不想修改定义顺序,可以把UserSerializer写成字符串形式,Django REST Framework会自动解析这个引用:

class BlogSerializer(serializers.ModelSerializer):
    class Meta:
        model = Blog
        fields = "__all__"
    
    # 用字符串引用后续定义的序列化器
    user = 'UserSerializer'(read_only=True)

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = "__all__"

    blog = BlogSerializer(many=True, read_only=True)

额外提示

  • 确认你的Blog模型中外键字段确实命名为user,如果模型里外键叫author这类其他名称,序列化器里的字段名也要对应修改。
  • 如果需要在创建Blog时自动关联当前用户,可以在视图的perform_create方法中设置,无需去掉read_only=True(避免前端传入非法用户ID)。

内容的提问来源于stack exchange,提问作者アリ・ナディム

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 00:27:10