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

如何在Django Rest Framework中让序列化器返回pk而非id?

把序列化器输出的id替换为pk的三种实现方式

方法一:显式定义字段并关联源字段

直接在序列化器中声明pk字段,通过source参数绑定模型的id字段,同时在fields里排除原有的id,只保留需要的字段:

from . import models
from rest_framework import serializers

class FooSerializer(serializers.ModelSerializer):
    pk = serializers.IntegerField(source='id')

    class Meta:
        model = models.Foo
        fields = ['pk', 'done']

方法二:重写to_representation方法(推荐)

这种方式不需要修改字段列表,适合原本用fields='__all__'的场景,通过重写序列化器的输出逻辑,直接替换键名:

from . import models
from rest_framework import serializers

class FooSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Foo
        fields = '__all__'

    def to_representation(self, instance):
        data = super().to_representation(instance)
        # 将id键的值转移到pk,再删除原id键
        data['pk'] = data.pop('id')
        return data

这种方法的优势是适配性更强——不管模型主键字段叫什么(比如一对一模型用外键作为主键),instance.pk都能正确指向主键,完美匹配代码库统一用pk的规范。

方法三:使用SerializerMethodField

通过自定义方法获取实例的主键值,同样需要在fields里排除id:

from . import models
from rest_framework import serializers

class FooSerializer(serializers.ModelSerializer):
    pk = serializers.SerializerMethodField()

    def get_pk(self, instance):
        return instance.pk

    class Meta:
        model = models.Foo
        fields = ['pk', 'done']

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 23:05:28