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

如何在Django REST Framework序列化时返回选项显示名称?

解决DRF序列化器返回Choice字段显示名称的问题

针对你的需求,要在返回的JSON中包含destination字段的友好显示名称,有两种简洁的实现方式,完全适配你当前的Django 2.0.3 + DRF 3.8.2环境:

方法一:使用SerializerMethodField(推荐,符合DRF规范)

直接在序列化器中新增一个字段,调用模型自带的get_destination_display()方法获取显示名称:

class TransferCostSerializer(serializers.ModelSerializer):
    # 定义获取显示名称的字段
    destination_display = serializers.SerializerMethodField()

    def get_destination_display(self, instance):
        # 调用模型的内置方法获取Choice的显示文本
        return instance.get_destination_display()

    def to_representation(self, instance):
        field_view = super().to_representation(instance)
        if field_view['is_active']:
            return field_view
        return None

    class Meta:
        model = TransferCost
        # 把新增的字段加入返回字段列表
        fields = ('id', 'destination', 'destination_display', 'total_cost', 'is_active',)

方法二:在to_representation中直接添加字段

如果你不想新增SerializerMethodField,也可以在已有的to_representation方法里直接插入显示名称字段:

class TransferCostSerializer(serializers.ModelSerializer):
    def to_representation(self, instance):
        field_view = super().to_representation(instance)
        # 手动添加显示名称字段
        field_view['destination_display'] = instance.get_destination_display()
        if field_view['is_active']:
            return field_view
        return None

    class Meta:
        model = TransferCost
        fields = ('id', 'destination', 'total_cost', 'is_active',)

为什么之前的get_FOO_display尝试无效?

DRF不会自动将模型的get_FOO_display()方法映射为序列化字段,必须显式通过SerializerMethodField定义,或者在to_representation中手动注入字段,才能让这个显示名称出现在返回的JSON里。

验证效果

修改后返回的JSON会完全符合你的预期:

[
    {
        "id": 1,
        "destination": "transfer_airport",
        "destination_display": "Only from airport",
        "total_cost": 25,
        "is_active": true
    },
    {
        "id": 2,
        "destination": "transfer_round_trip",
        "destination_display": "Round trip",
        "total_cost": 45,
        "is_active": true
    }
]

Vue.js中使用示例

在Vue的模板里,你可以直接用destination_display渲染选项文本,用destination作为绑定值:

<select v-model="selectedTransfer">
  <option 
    v-for="transfer in transferCosts" 
    :key="transfer.id" 
    :value="transfer.destination"
  >
    {{ transfer.destination_display }}
  </option>
</select>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:53:06