使用PrimaryKeyRelatedField为何仅返回主键,未序列化对象?
问题原因及解决方案
原因
你在GameSerializer中给owner字段指定了serializers.PrimaryKeyRelatedField,这个字段的核心作用就是仅返回关联对象的主键ID,这是它的默认行为,所以接口响应里只会拿到owner的ID值,而不是包含email、username的完整用户信息。
解决方案
要返回owner的完整信息,你需要使用嵌套序列化器,有两种常用实现方式:
方式一:定义User专属序列化器并嵌套引用
先创建一个User序列化器,指定要返回的用户字段:
class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = ("id", "username", "email") # 根据需求添加或删除字段
然后修改GameSerializer,将原来的PrimaryKeyRelatedField替换为这个User序列化器:
class GameSerializer(serializers.ModelSerializer): owner = UserSerializer(read_only=True) class Meta: model = Game fields = ("id", "name", "description", "owner")
方式二:用SerializerMethodField自定义返回内容
如果不需要单独定义User序列化器,也可以通过SerializerMethodField手动构造返回的用户信息:
class GameSerializer(serializers.ModelSerializer): owner = serializers.SerializerMethodField() def get_owner(self, obj): # 处理owner为null的情况,避免报错 if not obj.owner: return None return { "id": obj.owner.id, "username": obj.owner.username, "email": obj.owner.email } class Meta: model = Game fields = ("id", "name", "description", "owner")
内容的提问来源于stack exchange,提问作者Cedric Martens
相关产品推荐
相关产品推荐

