如何在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
相关产品推荐
相关产品推荐

