📜  Django 模型中的自定义字段验证(1)

📅  最后修改于: 2023-12-03 15:14:44.245000             🧑  作者: Mango

Django 模型中的自定义字段验证

Django 是一个开源的高级 Web 框架,内置了强大的模型层。模型是 Django Web 应用程序的核心部分之一,它提供了与数据库交互的 API。在业务逻辑复杂的 Web 项目中,往往需要对模型中的某些字段进行额外的验证。Django 提供了丰富的验证方法和自定义验证器,使您能够轻松实现各种复杂的特定验证逻辑。

字段级验证

Django 的模型层提供了多种形式的字段级验证器。有以下三种基本的验证方式:

  • 常规验证器:这些验证器在模型定义中使用字符串参数指定,并与模型字段相互关联。常用的字段级验证器包括 max_lengthmin_lengthnull 等等。

  • 编程验证器:您还可以编写自己的验证器函数,指定该函数作为字段的验证器。如下是一个自定义的验证器示例:

from django.core.exceptions import ValidationError

def validate_even(value):
    if value % 2 != 0:
        raise ValidationError('{} is not an even number.'.format(value))
  • 完全控制验证:该选项可用于在保存或更新模型实例之前运行自定义验证。例如,您可能希望在保存生成一个记录时调用某个第三方 API 来验证数据。全局/实例级验证器将使您拥有该控制权。
自定义字段

如果您需要在 Django 模型中实现与默认字段类似但具有特殊特性的字段,则可以创建自己的自定义字段。

自定义字段通常用于以下场景:

  • 为字段添加特定的验证逻辑(例如,“电子邮件”字段)
  • 创建一个自定义的用户权限字段

在下面的示例中,我们将定义一个自定义字段 LowerCharField,该字段扩展了 Django 内置的 CharField 字段并要求其输入值均为小写字母。

from django.db import models

class LowerCharField(models.CharField):
    def __init__(self, *args, **kwargs):
        super(LowerCharField, self).__init__(*args, **kwargs)

    def to_python(self, value):
        # 当从数据库中取出值时,将其转换为 Python 对象
        return value.lower()

    def get_prep_value(self, value):
        # 将输入值转换为数据库可以保存的值
        return value.lower()

    def formfield(self, **kwargs):
        # 当 Django 创建表单字段时使用
        defaults = {'widget': forms.TextInput(attrs={'class': 'lowercase-input'})}
        defaults.update(kwargs)
        return super(LowerCharField, self).formfield(**defaults)

该示例定义了 LowerCharField 类,它从 models.CharField 继承并覆盖了三个方法:

  • to_python:每当模型从数据库中读取数据时,都会调用该方法,将从数据库中读取的值转换为 Python 对象。

  • get_prep_value:每当需要将存储在字典中的值写入数据库时,都会调用该方法,将 Python 对象转换为在数据库中存储的值。

  • formfield:这个方法处理创建表单字段的细节,并返回一个表单字段实例。

这样,您就可以像这样使用您的自定义字段:

class MyModel(models.Model):
    my_field = LowerCharField(max_length=100)

在本文中,我们介绍了 Django 中模型层的自定义验证器和字段的方法。这些方法非常有用,可以轻松地实现具有复杂业务逻辑的现实世界 Web 应用程序。