我如何在序列化程序中使用验证器?我目前在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
作为参数还是不能像这样工作?
答案 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
中,验证程序函数中的参数将是整个OrderItemSerializer
(serializer.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)])
在这种情况下,此字段的验证数据将传递给验证器函数,而不是整个序列化程序的验证数据。