Mandate integer type in django-rest-framework validator for integerfield

回眸只為那壹抹淺笑 提交于 2020-06-15 05:10:47

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!