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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 20:46:04