You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django带Choices字段的模型:POST请求能否用显示值设置role_type?

问题解答

默认情况下直接传'Paid'无法设置role_type字段,因为Django REST Framework的ModelSerializer默认只接受RoleTypes中定义的数据库存储值(即'P'、'U'、'C')作为输入,传入显示名称'Paid'会触发验证错误,提示该值不在允许的选项范围内。

但可以通过自定义序列化器字段实现支持传入显示名称的需求,具体步骤如下:

方法:自定义Choice字段处理显示名称映射

  1. 定义一个继承自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)
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 03:51:09