在设计字段的时候,比如性别,这种固定选项的,我们通常用到ChoiceField字段,比如:

    1. GENDER_TYPE = (
    2. (1, "男"),
    3. (2, "女")
    4. )
    5. gender = models.SmallIntegerField(choices=GENDER_TYPE, verbose_name="性别", null=True, blank=True)

    这时候序列化后给到前端的数据只有key:1

    要返回给前端对应的值,可以在模型类下定义get_xxx_display方法来返回对应的值,然而这种方式的默认行为是readonly,无法进行create操作。
    所以这时候我们就需要重写ChoiceField字段,无论提交的是key,还是value都能正常的将数据添加到数据库中。

    1. class ChoiceField(serializers.ChoiceField):
    2. '''
    3. 重写ChoiceField
    4. '''
    5. def to_representation(self, obj):
    6. if obj == '' and self.allow_blank:
    7. return obj
    8. return self._choices[obj]
    9. def to_internal_value(self, data):
    10. for i in self._choices:
    11. if i == data or self._choices[i] == data:
    12. return i
    13. raise serializers.ValidationError("Acceptable values are {0}.".format(list(self._choices.values())))
    14. 序列化的时候重写原来的字段
    15. gender = ChoiceField(choices=models.User.GENDER_TYPE, required=False)