Django博客站点序列化问题:外键字段仅返回主键,期望返回完整关联User对象
解决DRF中外键仅返回ID,需返回完整User对象的问题
嘿,这个问题我太熟了!DRF默认会把外键字段序列化成对应的ID,但要返回完整的关联User对象,有两种简单好用的方法,我给你一步步讲清楚:
方法一:嵌套序列化器(推荐,灵活性更高)
这种方法可以让你精确控制要返回的User字段,非常适合自定义需求。
首先在你的serializers.py里先定义一个User模型的序列化器,然后在PostSerializer里嵌套使用它:
from rest_framework import serializers from django.contrib.auth.models import User from .models import Post # 定义User序列化器,按需选择要返回的字段 class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = ('first_name', 'last_name', 'username', 'email') # 你可以根据需求增减字段 class PostSerializer(serializers.ModelSerializer): # 把原来的author字段替换成我们定义的UserSerializer author = UserSerializer(read_only=True) class Meta: fields = ('id', 'author','body','created_at') model = Post
为什么加read_only=True?
因为在创建Post的时候,我们通常不需要前端传入完整的User对象(一般是自动关联当前登录用户),所以设置为只读,序列化时返回完整对象,反序列化时不会要求传入author的详细信息。如果需要手动指定author(比如后台管理场景),可以额外加一个author_id字段用于写操作:
class PostSerializer(serializers.ModelSerializer): author = UserSerializer(read_only=True) # 新增用于写操作的author_id字段 author_id = serializers.PrimaryKeyRelatedField( queryset=User.objects.all(), source='author', write_only=True ) class Meta: fields = ('id', 'author','author_id','body','created_at') model = Post
这样前端创建Post时传author_id,返回时就能拿到完整的author对象啦。
方法二:使用depth选项(快速简单)
如果不想额外写User序列化器,只想快速展开所有关联字段,可以在PostSerializer的Meta类里添加depth=1:
class PostSerializer(serializers.ModelSerializer): class Meta: fields = ('id', 'author','body','created_at') model = Post depth = 1 # 自动展开一级关联对象
这个方法的优点是简单快捷,不需要额外代码;缺点是会返回User模型的所有默认可序列化字段(不过DRF默认不会返回password这类敏感字段,不用担心),如果你需要过滤掉某些字段,就不如方法一灵活。
两种方法都能实现你想要的效果,根据你的需求选就行~
内容的提问来源于stack exchange,提问作者Aurora
相关产品推荐
相关产品推荐

