Django Rest Framework with ChoiceField

前端 未结 8 1939
轮回少年
轮回少年 2020-12-02 06:01

I have a few fields in my user model that are choice fields and am trying to figure out how to best implement that into Django Rest Framework.

Below is some simplifi

8条回答
  •  心在旅途
    2020-12-02 06:13

    Since DRF 3.1 there is new API called customizing field mapping. I used it to change default ChoiceField mapping to ChoiceDisplayField:

    import six
    from rest_framework.fields import ChoiceField
    
    
    class ChoiceDisplayField(ChoiceField):
        def __init__(self, *args, **kwargs):
            super(ChoiceDisplayField, self).__init__(*args, **kwargs)
            self.choice_strings_to_display = {
                six.text_type(key): value for key, value in self.choices.items()
            }
    
        def to_representation(self, value):
            if value is None:
                return value
            return {
                'value': self.choice_strings_to_values.get(six.text_type(value), value),
                'display': self.choice_strings_to_display.get(six.text_type(value), value),
            }
    
    class DefaultModelSerializer(serializers.ModelSerializer):
        serializer_choice_field = ChoiceDisplayField
    

    If You use DefaultModelSerializer:

    class UserSerializer(DefaultModelSerializer):    
        class Meta:
            model = User
            fields = ('id', 'gender')
    

    You will get something like:

    ...
    
    "id": 1,
    "gender": {
        "display": "Male",
        "value": "M"
    },
    ...
    

提交回复
热议问题