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

Ish*_*are 0 django django-validation python-3.x django-rest-framework

我有一个模型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)
Run Code Online (Sandbox Code Playgroud)

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

serializers.py

class CategoriesSerializer(serializers.ModelSerializer):
     class Meta:
         model = Categories
         fields = ('id', 'type', 'name', 'details')
Run Code Online (Sandbox Code Playgroud)

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

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

nev*_*ner 5

DRF的串行器提供字段级别的验证选项。您可以通过实现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
Run Code Online (Sandbox Code Playgroud)

  • 我正在使用“CreateAPIView”和“perform_create”,但它没有命中序列化器的“validate_field_name”函数中的断点。在调用“perform_create”之前,是否需要覆盖“create”函数? (2认同)