在设计字段的时候,比如性别,这种固定选项的,我们通常用到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 obj
return self._choices[obj]
def to_internal_value(self, data):
for i in self._choices:
if i == data or self._choices[i] == data:
return i
raise serializers.ValidationError("Acceptable values are {0}.".format(list(self._choices.values())))
序列化的时候重写原来的字段
gender = ChoiceField(choices=models.User.GENDER_TYPE, required=False)