我有一个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
答案 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验证器来验证其余字段。