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

