【问题标题】:Validate specific field in DRF serializer验证 DRF 序列化程序中的特定字段
【发布时间】:2018-02-20 18:23:02
【问题描述】:

我有一个带有JSONField 的模型。

model.py

class Categories(models.Model):
     type = models.CharField(max_length=20)
     name = models.CharField(max_length=500)
     details = JSONField(blank=True, null=True)

目前我正在使用serializers.ModelSerializer 对上述模型进行序列化:

serializers.py

class CategoriesSerializer(serializers.ModelSerializer):
     class Meta:
         model = Categories
         fields = ('id', 'type', 'name', 'details')

因此,仅检查详细信息字段以包含valid json。我真正需要做的是根据为详细信息字段定义的 Json Schema 执行一些自定义验证。但是,由于我不希望对其余字段进行任何其他自定义验证,因此我想继续使用 serializers.ModelSerializer 提供的验证。有什么方法可以覆盖一个字段的验证,可能是通过为详细信息字段编写自定义序列化器

注意问题不是关于如何编写自定义验证器,而是关于如何在继承ModelSerializer的序列化器中的字段上使用该自定义验证器

【问题讨论】:

    标签: django python-3.x django-rest-framework django-validation


    【解决方案1】:

    DRF 的序列化程序提供field level 验证选项。您可以通过实现validate_details 方法来执行详细信息字段验证:

    class CategoriesSerializer(serializers.ModelSerializer):
         class Meta:
             model = Categories
             fields = ('id', 'type', 'name', 'details')
    
         def validate_details(self, value):
            if value['not_valid']:
                raise serializers.ValidationError("Not valid")
            return value
    

    【讨论】:

    • 我可以使用我的自定义验证器类而不是函数吗?或者可能在validate_details 函数内部?我需要使用一个类,因为details 字段有各种架构,所以我想从这里的验证器继承中受益。
    • @IshanKhare 您可以尝试使用字段的验证器参数 django-rest-framework.org/api-guide/fields/#validators 传递基于类的验证器 django-rest-framework.org/api-guide/validators/#class-based
    • 类似validators=[MyDetailsValidator('details')] ?
    • @IshanKhare 不,像这样:details = serializers.JSONField(validators=[MyDetailsValidator]
    • 我正在使用CreateAPIViewperform_create,但它没有达到序列化程序的validate_field_name 函数中的断点。在调用perform_create之前是否需要覆盖create函数?
    【解决方案2】:

    另一种方法是在 Django 模型级别验证 JSONFiled,您可以使用 jsonschema 包。

    例如

    SCHEMA = { put JSON Schema draft here }
    

    让我们验证一下

    from jsonschema import validate, ValidationError
    
    def validate_json_filed(value):
        try:
            validate(value, SCHEMA)
        except ValidationError as e:
            raise serializers.ValidationError(e)
    

    那么就

    name = JSONField(validators=[validate_json_field], default=dict, blank=True)
    

    您可以使用 DRF 验证器验证该字段的其余部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-19
      • 2017-11-09
      • 2020-08-14
      • 2020-05-27
      • 1970-01-01
      • 2019-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多