gpt4 book ai didi

Django 模型 : Add validation to custom field

转载 作者:行者123 更新时间:2023-12-01 05:00:25 24 4
gpt4 key购买 nike

TLDR;

如何提供封装在字段类中的自定义、模型级别、字段验证?

其余的部分

我正在玩两个 JSONField 实现,( firstsecond )。我正在为我的应用程序使用 Django 和 Django REST 框架的组合。我没有在表单级别做任何事情,只有一个暴露模型的 Web API。

理想情况下,我想在一个地方编写此验证,并让它在序列化程序级别 + 模型级别上运行(比如当我通过 validators=[x] 时)。我不能使用通常的 validators=[x]因为我需要允许 blank=True还要验证空白值类型:|。

我有一个用例,我想验证我的 JSONField 的内容(键、值类型)。 .使用 validictory ,我可以这样做:

  • 强制调用self.full_clean()在我的save()
  • 覆盖 clean()在我的模型上进行验证

  • 但是,我真正想做的是:将此验证添加到 JSONField 的子类中。 .我想离开尽可能多的 parent Field上课做它的事。到目前为止,我有:
    from django.db import models
    from jsonfield import JSONField

    class myValidatorField(JSONField):
    def validate(self, *args, **kwargs):
    # do some validation here
    super(myValidatorField, self).validate(*args, **kwargs)

    class MyModel(models.Model):
    jsonstuff = myValidatorField(default=[])

    def save(self, *args, **kwargs):
    self.full_clean()
    super(MyModel, self).save(*args, **kwargs)

    但是,我无法让它工作。这个 validate()方法不适用于 second实现,对于 first ,它运行 4 次。

    使困惑。

    最佳答案

    我最终得到了这段代码,它似乎可以解决问题。

    仅供引用,在我的用例中,我必须实现一个自定义 django rest 框架异常处理程序来捕获我所有的模型级别 ValidationError错误并将其转换为网络 400错误。

    # fields.py
    import validictory
    from jsonfield import JSONField

    class JSONSchemaField(JSONField):
    """A field that will ensure the data entered into it is valid JSON *and*
    internally validate to a JSON schema of your choice."""
    def __init__(self, *args, **kwargs):
    self.schema = kwargs.pop('schema', {})
    super(JSONSchemaField, self).__init__(*args, **kwargs)

    def clean(self, raw_value, model_instance):
    try:
    validictory.validate(raw_value, self.schema)
    except (validictory.FieldValidationError,
    validictory.SchemaError,
    validictory.validator.RequiredFieldValidationError) as err:
    raise ValidationError(err)
    return super(JSONSchemaField, self).clean(raw_value, model_instance)

    # mixins.py
    class ModelValidationMixin(object):
    """Django currently doesn't force validation on the model level
    for compatibility reasons. We enforce here, that on each save,
    a full valdation run will be done the for model instance"""
    def save(self, *args, **kwargs):
    self.full_clean()
    super(ModelValidationMixin, self).save(*args, **kwargs)

    # models.py
    class MyModel(ModelValidationMixin):
    json = JSONSchemaField(default='[]', schema=SCHEMA)

    关于Django 模型 : Add validation to custom field,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33460690/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com