验证DRF序列化程序中的特定字段

时间:2017-09-12 10:18:23

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

我有一个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

的字段上使用该自定义验证程序

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

另一种方法是在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验证器来验证其余字段。