问题
django-rest-framework validator accepts string quoted integers as valid data for integer field. Is there a way to mandate data type so that string quoted integers won't be accepted ?
回答1:
Serializer keeps raw data in self.initial_data
from where custom validation methods can retrieve it. So the following works
class Test(Serializer):
true_int = IntegerField()
def validate_true_int(self, value):
value = self.initial_data.get('true_int')
if isinstance(value, int):
return value
raise ValidationError("Not an int")
data = {'true_int': '10'}
t = Test(data=data)
t.is_valid() # false
data = {'true_int': 10}
t = Test(data=data)
t.is_valid() # true
回答2:
You can add a custom validator to the field.
Custom Validator
You can create a custom serializer field that errors before conversion to an integer.
class TrueIntegerField(serializers.IntegerField):
def to_internal_value(self, data):
if isinstance(data, six.text_type):
raise serializers.ValidationError("Value should be an integer")
return super().to_internal_value(data)
回答3:
You can write field validation
def validate_field_name(self):
validating_data = self.context.get('request').data.get('field_name')
if isinstance(validating_data, int):
return validating_data
raise ValidationError('Integer value required')
来源:https://stackoverflow.com/questions/54676875/mandate-integer-type-in-django-rest-framework-validator-for-integerfield