gpt4 book ai didi

validation - Django rest 框架在自己的验证之前进行模型字段验证

转载 作者:行者123 更新时间:2023-12-03 23:57:44 26 4
gpt4 key购买 nike

我不明白 django rest 框架验证过程。
doc say该验证完全在序列化程序类上执行。

然而,
对于模型中的 PositiveIntegerField,当 ModelSerializer 接收到负值时,模型验证在自定义 ModelSerializer validate_myfield 方法之前处理。

class Blop(models.Model):
quantity = models.PositiveSmallIntegerField()

class BlopSerializer(serializers.ModelSerializer):
def validate_quantity(self, value):
return max(15, value)

class Meta:
model = Blop

如果数量小于零,则从不调用 validate_quantity ...

我也试过:
  • 使用模型“干净”方法,但其余框架不使用它。
  • 通过将 min_value 设置为 None 来禁用模型中的最小值验证器,但它会使其余框架崩溃
  • 在模型字段中强制 MinValueValidator :validators=[MinValueValidator(-math.inf, 'Minimum value is -Infinity')] ,可以用,但是太丑了

  • 在这种情况下,如何让序列化程序确保非负值?

    最佳答案

    我认为您的问题是您正在调用 serializer.is_valid()没有 kwarg 或 raise_exception=False 的方法.
    raise_exception=True序列化程序引发 ValidationError , 如果您传递无效数据。

    为了更好地理解,让我们看看 Serializer.to_internal_value方法。

    def to_internal_value(self, data):
    """
    Dict of native values <- Dict of primitive datatypes.
    """
    if not isinstance(data, dict):
    message = self.error_messages['invalid'].format(
    datatype=type(data).__name__
    )
    raise ValidationError({
    api_settings.NON_FIELD_ERRORS_KEY: [message]
    })

    ret = OrderedDict()
    errors = OrderedDict()
    fields = self._writable_fields

    for field in fields:
    validate_method = getattr(self, 'validate_' + field.field_name, None)
    primitive_value = field.get_value(data)
    try:
    validated_value = field.run_validation(primitive_value)
    if validate_method is not None:
    validated_value = validate_method(validated_value)
    except ValidationError as exc:
    errors[field.field_name] = exc.detail
    except DjangoValidationError as exc:
    errors[field.field_name] = list(exc.messages)
    except SkipField:
    pass
    else:
    set_value(ret, field.source_attrs, validated_value)

    if errors:
    raise ValidationError(errors)

    return ret

    正如你在这里看到的,首先,序列化程序调用 field.run_validation方法,它使用 django-fields 验证器并引发 DjangoValidationError异常,因此,您的验证方法永远不会被调用。

    关于validation - Django rest 框架在自己的验证之前进行模型字段验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40265332/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com