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
相关产品推荐
相关产品推荐

