Django JSONField有特定键

时间:2017-04-12 18:22:17

标签: django django-models django-rest-framework django-jsonfield

我的班级看起来像这样:

class Foo(models.Model):
  known_by = JSONField()

我的数据看起来像这样

{ "known_by" : [
                {'by':'name1', 'value':['def']},
                {'by':'name2', 'value':['bar']}
               ]
}

我有什么方法可以强制Jsonfield需要遵循by,value[] dict的格式。我知道如何使用serialiazers

执行此操作

任何其他更简洁的方法来强制执行此操作(在模型定义中)?感谢

3 个答案:

答案 0 :(得分:4)

您可以在模型字段中添加验证器,如下所示:

 class Foo(models.Model):
     known_by = ArrayField(JSONField(max_length=100), size=4, validators=[a_json_array_validator])

验证器是:

def a_json_array_validator(value):
    if any([not is_json_valid(entry) for entry in value]):
        raise ValidationError(
            _('%(value) is not a valid json'),
            params={'value': value},
         )

(实际的json验证取决于你);-) 请注意,验证器接收python对象,因此它实际上是一个字典。

答案 1 :(得分:1)

你可以这样实现:

from django.db import models

class Bar(models.Model):
    by = models.CharField()
    value = models.ArrayField()


class Foo(models.Model):
    known_by = models.ForeignKey(Bar, on_delete=models.CASCADE)

答案 2 :(得分:0)

为什么不覆盖save方法来执行?

class Foo(models.Model):
    known_by = JSONField()

    def save(self, *args, **kwargs):
        # begin validation code

        # end validation code
        if valid:
            super(Model, self).save(*args, **kwargs)
        else:
            # something else, maybe http error code?