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

Django中ForeignKey关联字段API返回ID而非名称问题咨询

Django 序列化外键返回作者名称解决方案

默认情况下Django REST Framework的ModelSerializer处理外键字段时,默认使用PrimaryKeyRelatedField,所以返回的是关联表的主键值,你可以按照以下几种方案修改实现返回作者名称:


方案1:使用StringRelatedField(最简方案)

前提是你的Author模型的__str__方法已经配置为返回作者名称,比如Author模型中定义了def __str__(self): return self.name。
修改序列化器代码如下:

class BookSerializer(serializers.ModelSerializer):
    # 新增此行,StringRelatedField会调用关联对象的__str__方法返回对应值
    author = serializers.StringRelatedField()
    class Meta:
        model = Book
        fields = ('id', 'title', 'author',
                  'price', 'published', 'edition',
                  "isbn_code", 'created_at', "updated_at",
                  "pages", "description", "cover",
                  "genre", "language", "format",
                  "publisher"
                  )

注意:此方案默认author字段为只读,如果需要在创建/更新书籍时传作者ID,需要额外配置read_only=False,或者拆分读写字段


方案2:使用CharField指定source(不依赖__str__方法)

如果不想依赖Author的__str__配置,或者需要明确指定取作者表的某个字段,可以用此方案:

class BookSerializer(serializers.ModelSerializer):
    # source参数指定关联表的对应字段,此处假设Author表存储名称的字段为name,可根据实际字段名修改
    author = serializers.CharField(source='author.name', read_only=True)
    class Meta:
        model = Book
        fields = ('id', 'title', 'author',
                  'price', 'published', 'edition',
                  "isbn_code", 'created_at', "updated_at",
                  "pages", "description", "cover",
                  "genre", "language", "format",
                  "publisher"
                  )

如果需要同时支持「读返回作者名、写传入作者ID」的需求,可以拆分两个字段分别处理读写:

class BookSerializer(serializers.ModelSerializer):
    author_name = serializers.CharField(source='author.name', read_only=True)
    class Meta:
        model = Book
        fields = ('id', 'title', 'author', 'author_name',
                  'price', 'published', 'edition',
                  "isbn_code", 'created_at', "updated_at",
                  "pages", "description", "cover",
                  "genre", "language", "format",
                  "publisher"
                  )
        extra_kwargs = {
            'author': {'write_only': True} # 写入时用author传ID,读取时返回author_name字段
        }

方案3:嵌套序列化器(需要返回作者多个信息时使用)

如果除了名称还需要返回作者的ID、简介等其他信息,可以单独定义Author序列化器嵌套使用:

# 先定义Author的序列化器
class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Author
        fields = ('id', 'name') # 按需添加需要返回的作者字段

class BookSerializer(serializers.ModelSerializer):
    author = AuthorSerializer(read_only=True)
    class Meta:
        model = Book
        fields = ('id', 'title', 'author',
                  'price', 'published', 'edition',
                  "isbn_code", 'created_at', "updated_at",
                  "pages", "description", "cover",
                  "genre", "language", "format",
                  "publisher"
                  )

如果需要支持嵌套写入,需要重写序列化器的create和update方法自行处理关联逻辑


内容的提问来源于stack exchange,提问作者Aleksa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:57:03