在 ChoiceField 中返回 display_name

Sim*_*oV8 2 django json choicefield django-serializer django-rest-framework

我正在 DRF 中使用ModelViewSet和实现一些 REST API ModelSerializer。我所有的 API 都使用 JSON 格式,我的一些模型使用 ChoiceField 字段,如下所示:

MyModel(models.Model):
     KEY1 = 'Key1'
     KEY2 = 'Key2'
     ATTRIBUTE_CHOICES = (
         (KEY1, 'Label 1'),
         (KEY2, 'Label 2'))
     attribute = models.CharField(max_length=4, 
                                  choices=ATTRIBUTE_CHOICES, default=KEY1)
Run Code Online (Sandbox Code Playgroud)

我的问题是,默认情况下,DRF 总是返回(并接受)JSON 消息的这些选项的键(请参阅此处),但我想改用标签,因为我认为更一致和更清楚谁将使用那些 API。有什么建议吗?

Sim*_*oV8 5

我找到了一个可能的解决方案,即定义我自己的领域如下:

class MyChoiceField(serializers.ChoiceField):

    def to_representation(self, data):
        if data not in self.choices.keys():
            self.fail('invalid_choice', input=data)
        else:
            return self.choices[data]

    def to_internal_value(self, data):
        for key, value in self.choices.items():
            if value == data:
                 return key
        self.fail('invalid_choice', input=data)
Run Code Online (Sandbox Code Playgroud)

它的工作方式与 to 相同ChoiceField,但返回并接受标签而不是键。