【问题标题】:How to UnitTest Django Rest Framework Serializers's create method? [closed]如何对 Django Rest Framework 序列化程序的创建方法进行单元测试? [关闭]
【发布时间】:2020-11-22 12:16:54
【问题描述】:

如何测试create method of serializer

【问题讨论】:

标签: django django-rest-framework django-serializer django-validation


【解决方案1】:

字段级别

您可以通过将 .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']
        )

【讨论】:

  • 我是否可以使用动态验证,例如支持我想更改数据库中的一个字段,使用这些更改,验证应用于其他字段的旧键值更改?想要开发完全依赖的验证。
  • 希望你能理解我的问题。
  • @VikasUkani 当然可以,但是您需要在def validate(self, data): 函数中指定它们,您可以简单地从数据库中获取配置并返回值或相应地引发异常
  • 是否可以继承您从serializers.ModelSerializer 描述的某些类?所以我可以将自动验证与自定义结合起来。
  • @Aska 当然,因为ModelSerializer 本身继承自Serializer 类。
猜你喜欢
  • 2020-08-04
  • 2017-06-04
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 2014-11-03
  • 2016-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多