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是:
rest_framework序列化器中ChoiceField的choices显示value代替显示key的方法_第1张图片
因为我使用了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()

这两种方式都能导致以下结果:
rest_framework序列化器中ChoiceField的choices显示value代替显示key的方法_第2张图片

你可能感兴趣的:(Django学习)