2

我有一个看起来像这样的 Django 模型:

class Foo:
  data = JSONField(encoder=DjangoJSONEncoder, default=dict)

我有相应的序列化程序,它非常基本:

class FooSerializer(BaseSerializer):

  class Meta:
    model = models.Foo
    fields = '__all__'

我想做的是对序列化程序中的那个 JSON 字段进行一些验证。我尝试通过覆盖validateandcreate函数来做到这一点,但在这两种情况下,attrs.dataor的值validated_data.data都是None

奇怪的是,如果我在pre-saveorpost-save信号中创建相同的验证,则该instance.data值不是None并且实际上具有我在请求中传递的值。

我想知道我是否做错了什么,或者 DRF 是否不支持对序列化程序中的 JSON 字段进行验证,只是希望您在信号中进行验证。这似乎有点不对劲。

4

1 回答 1

1

您可以将自定义验证器作为参数传递,例如

 class Foo(models.Model):
     data = JSONField(encoder=DjangoJSONEncoder, default=dict,validators=[validate_json])

或简单的 TextField 之类的

class Foo(models.Model):
    data = models.TextField(default={},validators=[validate_json])

并将 validate_json 定义为

import json
from rest_framework.serializers import ValidationError
def validate_json(value):
    #your custom validations here
    try:
        json.loads(value) 
    except:
        raise ValidationError(u'%s is not an Valid Json - ' % value)
于 2019-02-01T17:35:00.347 回答