Django REST Framework序列化验证

时间:2016-08-22 14:29:16

标签: django django-rest-framework

我如何在序列化程序中使用验证器?我目前在app/validators.py中创建了验证程序,并在app/serializers.py中设置了序列化程序。

class OrderItemSerializer(serializers.ModelSerializer):
    item_id = serializers.IntegerField()
    item_date = serializers.DateTimeField()
    ...

    class Meta:
        model = Item
        validators = [validate_item_date]
        fields = ('item_id', 'item_date')

from rest_framework.serializers import ValidationError

validators.py

def validate_item_date(item_date):
    if item_date < {something}:
        raise ValidationError('')

我的问题基本上是:我在这里提供item_date作为参数还是不能像这样工作?

3 个答案:

答案 0 :(得分:0)

您可以像这样添加验证到序列化工具

class OrderItemSerializer(serializers.ModelSerializer):
    def validate_item_date(self, item_date):
        if item_date < {something}:
            raise ValidationError('')
        return item_date

答案 1 :(得分:0)

DRF允许进行字段级验证。将您的函数名称设置为:def validate_(fieldname)。和drf将针对相应的字段名称运行该函数。在下面的代码中,“validate_item_date”,drf将其与“item_date”字段对应。

class OrderItemSerializer(serializers.ModelSerializer):
    item_date = serializers.DateTimeField()

    class Meta:
        model = Item

    def validate_item_date(self, value):
        if value < 10:
            raise ValidationError('')
        return value

答案 2 :(得分:0)

在您的示例item_date中,验证程序函数中的参数将是整个OrderItemSerializerserializer.validated_data)的验证数据。

这是应该如何:

def validate_item_date(validated_data):
    if validated_data.get('item_date') < {something}:
        raise ValidationError('')

通过使用序列化程序杠杆验证,您可以对序列化程序的其他字段进行验证:

def validate_item_date(validated_data):
    if validated_data.get('item_date') < validated_data.get('order_attr'):
        raise ValidationError('')

当然,您应该在这里正确处理无值和日期比较,这是代码的简化版本。

如果要静态指定{something},可以使用基于类的验证器。

class OrderItemValidator:
    def __init__(self, a):
        self.a = a

    def __call__(self, value, *args, **kwargs):
        item_date = value.get('item_date')
        if item_date < self.a:
            raise serializers.ValidationError('')

class OrderItemSerializer(serializers.ModelSerializer):
    ...

    class Meta:
        validators = [OrderItemValidator(some_date)]

小心不要在这里使用OrderItemValidator(timezone.now())这样的东西:)。

您还可以指定字段级验证器

item_date = serializers.DateTimeField(validators=[OrderItemValidator(some_date)])

在这种情况下,此字段的验证数据将传递给验证器函数,而不是整个序列化程序的验证数据。