【发布时间】:2020-11-22 12:16:54
【问题描述】:
如何测试create method of serializer?
【问题讨论】:
-
好的,让我看看这个文档。谢谢,
标签: django django-rest-framework django-serializer django-validation
如何测试create method of serializer?
【问题讨论】:
标签: django django-rest-framework django-serializer django-validation
您可以通过将 .validate_ 方法添加到您的 Serializer 子类来指定自定义字段级验证。这些类似于 Django 表单上的 .clean_ 方法。
这些方法采用单个参数,即需要验证的字段值。
您的 validate_ 方法应该返回经过验证的值或引发 serializers.ValidationError。例如:
from rest_framework import serializers
class BlogPostSerializer(serializers.Serializer):
title = serializers.CharField(max_length=100)
content = serializers.CharField()
def validate_title(self, value):
"""
Check that the blog post is about Django.
"""
if 'django' not in value.lower():
raise serializers.ValidationError("Blog post is not about Django")
return value
要执行需要访问多个字段的任何其他验证,请将名为 .validate() 的方法添加到您的 Serializer 子类。此方法采用单个参数,即字段值字典。如有必要,它应该引发一个 serializers.ValidationError ,或者只返回经过验证的值。例如:
from rest_framework import serializers
class EventSerializer(serializers.Serializer):
description = serializers.CharField(max_length=100)
start = serializers.DateTimeField()
finish = serializers.DateTimeField()
def validate(self, data):
"""
Check that start is before finish.
"""
if data['start'] > data['finish']:
raise serializers.ValidationError("finish must occur after start")
return data
序列化器上的各个字段可以包含验证器,方法是在字段实例上声明它们,例如:
def multiple_of_ten(value):
if value % 10 != 0:
raise serializers.ValidationError('Not a multiple of ten')
class GameRecord(serializers.Serializer):
score = IntegerField(validators=[multiple_of_ten])
...
序列化器类还可以包括可重用的验证器,这些验证器应用于完整的字段数据集。这些验证器通过在内部 Meta 类中声明它们来包含,如下所示:
class EventSerializer(serializers.Serializer):
name = serializers.CharField()
room_number = serializers.IntegerField(choices=[101, 102, 103, 201])
date = serializers.DateField()
class Meta:
# Each room only has one event per day.
validators = UniqueTogetherValidator(
queryset=Event.objects.all(),
fields=['room_number', 'date']
)
【讨论】:
def validate(self, data): 函数中指定它们,您可以简单地从数据库中获取配置并返回值或相应地引发异常
serializers.ModelSerializer 描述的某些类?所以我可以将自动验证与自定义结合起来。
ModelSerializer 本身继承自Serializer 类。