在设计字段的时候,比如性别,这种固定选项的,我们通常用到ChoiceField字段,比如:
GENDER_TYPE = ((1, "男"),(2, "女"))gender = models.SmallIntegerField(choices=GENDER_TYPE, verbose_name="性别", null=True, blank=True)
这时候序列化后给到前端的数据只有key:1
要返回给前端对应的值,可以在模型类下定义get_xxx_display方法来返回对应的值,然而这种方式的默认行为是readonly,无法进行create操作。
所以这时候我们就需要重写ChoiceField字段,无论提交的是key,还是value都能正常的将数据添加到数据库中。
class ChoiceField(serializers.ChoiceField):'''重写ChoiceField'''def to_representation(self, obj):if obj == '' and self.allow_blank:return objreturn self._choices[obj]def to_internal_value(self, data):for i in self._choices:if i == data or self._choices[i] == data:return iraise serializers.ValidationError("Acceptable values are {0}.".format(list(self._choices.values())))序列化的时候重写原来的字段gender = ChoiceField(choices=models.User.GENDER_TYPE, required=False)
