Django带Choices字段的模型:POST请求能否用显示值设置role_type?
问题解答
默认情况下直接传'Paid'无法设置role_type字段,因为Django REST Framework的ModelSerializer默认只接受RoleTypes中定义的数据库存储值(即'P'、'U'、'C')作为输入,传入显示名称'Paid'会触发验证错误,提示该值不在允许的选项范围内。
但可以通过自定义序列化器字段实现支持传入显示名称的需求,具体步骤如下:
方法:自定义Choice字段处理显示名称映射
- 定义一个继承自
serializers.ChoiceField的自定义字段,重写to_internal_value方法,实现显示名称到存储值的转换:
from rest_framework import serializers class ChoiceDisplayField(serializers.ChoiceField): def to_internal_value(self, data): # 先判断是否是合法的存储值 if data in self.choices: return data # 遍历选项,匹配显示名称对应的存储值 for stored_value, display_name in self.choices.items(): if display_name == data: return stored_value # 匹配失败抛出验证错误 self.fail('invalid_choice', input=data)
- 修改
RoleSerializer,将role_type字段替换为自定义的ChoiceDisplayField:
class RoleSerializer(serializers.ModelSerializer): role_type = ChoiceDisplayField(choices=Role.RoleTypes.choices) class Meta: model = Role fields = '__all__'
修改完成后,POST请求传递{'role_type':'Paid', 'role_count':2}就能正常创建Role资源,序列化器会自动将'Paid'转换为'P'存入数据库。
内容的提问来源于stack exchange,提问作者user3282758
相关产品推荐
相关产品推荐

