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

如何在Django REST framework中验证字段为预定义整数列表?

解决方案

方法一:结合IntegerField与choices参数(允许字符串转整数的场景)

如果你的API允许客户端传递字符串形式的数字(如'2')并自动转换为整数验证,可直接给IntegerField指定choices参数:

from rest_framework import serializers

class MySerializer(serializers.Serializer):
    valid_rules = [2, 3, 8]
    tags = serializers.ListField(
        child=serializers.IntegerField(choices=[(val, val) for val in valid_rules])
    )

验证效果:

  • [2, 8]通过验证
  • [4, 8]触发错误(4不在有效列表)
  • ['2', 8]会被自动转为[2, 8]并通过验证(适合允许类型转换的业务场景)

方法二:自定义验证函数(严格拒绝字符串形式的数字)

如果必须确保列表元素是原生整数类型(拒绝字符串'2'),可给ListField添加自定义验证器:

from rest_framework import serializers

class MySerializer(serializers.Serializer):
    valid_rules = [2, 3, 8]
    tags = serializers.ListField(child=serializers.IntegerField())

    def validate_tags(self, value):
        for item in value:
            if not isinstance(item, int):
                raise serializers.ValidationError(f"元素{item}必须是整数类型")
            if item not in self.valid_rules:
                raise serializers.ValidationError(f"元素{item}不在允许的列表中")
        return value

验证效果:

  • [2, 8]通过验证
  • [4, 8]触发错误(4不在有效列表)
  • ['2', 8]触发错误('2'是字符串类型)

原代码错误原因

你之前的代码serializers.IntegerField().ChoiceField(valid_rules)存在两个问题:

  • ChoiceField不是IntegerField的实例方法,无法链式调用,直接导致TypeError
  • 正确用法是给IntegerField传入choices参数,或单独使用ChoiceField并指定coerce=int实现类型转换

若想用ChoiceField实现(允许字符串转整数),也可这么写:

tags = serializers.ListField(
    child=serializers.ChoiceField(choices=[(val, val) for val in valid_rules], coerce=int)
)

内容的提问来源于stack exchange,提问作者Sina

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:25:17