rest_framework序列化器中ChoiceField的choices显示value代替显示key的方法

问题:

class BrandSerializer(serializers.ModelSerializer):
    etype = serializers.ChoiceField(choices=((0, '设备品牌'), (1, '软件品牌'), (2, '操作系统品牌')), help_text='0是设备 1是软件 2操作系统',
                               label='种类', )
    
    class Meta:
        model = Brand
        fields = "__all__"

原本的序列化方式导致传出去的results是:
在这里插入图片描述
因为我使用了bootstrap-table表格框架,故传到前端的是row包含数据,不是实例对象,因此无法使用{{Model名.get_字段名称_display}}
p.s.如果把etype单独弄个model,使其变成外键,倒是可以在model里配置:

def __str__(self):
    return self.get_etype_display()

这样或许取得的就是value了。但是还是不适合我的情况

解决:
方法1.重写ChoiceFieldto_representation表现方式:

class DisplayChoiceField(serializers.ChoiceField):

    def to_representation(self, obj):
        """返回选项的值"""
        return self._choices[obj]

这样的话,在序列化的时候自定义etype的序列化为:
etype = DisplayChoiceField(choices=((0, '设备品牌'), (1, '软件品牌'), (2, '操作系统品牌')), help_text='0是设备 1是软件 2操作系统', label='种类', )就行了
方法2.

class BrandSerializer(serializers.ModelSerializer):
  etype = serializers.SerializerMethodField()
  class Meta:
      model = Brand
      fields = "__all__"

  def get_etype(self,obj):
      return obj.get_etype_display()

这两种方式都能导致以下结果:
在这里插入图片描述

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值