Django项目如何给数据库添加约束

作者:大江狗 时间:2023-08-10 14:49:39 

只要你的Web开发知识不是语文老师教的,那么你应该已经知道一个合格的开发者应该永远抱着怀疑的眼光看用户提交的数据。你不仅需要在前端通过表单或其它方式进行验证,还需要在后台视图拿到用户发送的数据后再对其进行验证一遍。假如有一天你开发一个少儿不宜的网站,你的用户模型里有年龄(age)这个字段而你要求每个注册用户年龄都大于18岁,在Django中你当然可以自定义表单的clean方法, 自定义validators或者重写模型的save方法对年龄字段进行验证。然而你想过没有一件事没有?这能阻止某个员工或用户通过Django的admin后台或数据库可视化工具对数据库进行修改,把用户的年龄修改到18岁以下吗?当然不能。

划重点:前后端的数据验证并不能保证数据库里数据的正确性和有效性,在数据库层面添加一些约束条件是最根本的解决方法。

今天我们就来看下如何在Django项目中给数据库添加约束(Constraints)。

什么是数据库约束(db constraints)基本常识

数据库约束(Contraints)是在数据库层面对表中的数据进行进一步的限制, 保证数据的正确性、有效性和完整性(data integrity)。 约束通常与一个表相关联,并使用CREATE CONSTRAINT或CREATE ASSERTION SQL语句创建。他们定义数据库中的数据必须符合的某些属性。他们可以应用于列,整个表格,多个表格或整个模式。

常见的约束条件有:

  • not null - 列中的每个值都不能为NULL

  • primary key - 指定列中的值对于表中的每一行必须是唯一的,而不是NULL ; 

  • unique - 对于表中的每一行必须是唯一的

  • check - 指定一个表达式,为了满足约束条件,它必须计算为真

在Django中我们可以借助于它的ORM,而不是原始SQL语句创建约束,所以对SQL语句不熟悉的不用担心看不懂本文。not null和primary key这两个约束Django通常在创建数据表时会自动帮你加上,比如primary key永远是唯一的。如果你在定义模型时给某个字段设置了null=True, 那么Django就会取消not null的自动约束。

今天我们着重看下如何添加unique和check这两个常用的数据库约束。

UniqueConstraint (唯一约束)

假如我们有如下一个员工(employee)模型,我们希望让姓名(name)和email这个组合变得唯一,我们可以在Meta选项中定义一个unique_together元组。这样Django会自动为你创建数据库约束。

Django项目如何给数据库添加约束

同样需要unique_together的字段组合还有(room, date)等。当你试图注册相同用户名和用户email时,你会得到如下报错:

Django项目如何给数据库添加约束

由于unique_together这个方法将来会被淘汰,Django 2.2后建议在Meta.constraints选项中定义UniqueConstraints。它有两个属性,一是需要unique的字段或字段组合(fields),二是要给它取个名字(name)。

Django项目如何给数据库添加约束

CheckConstraint(条件约束)

条件约束确保一个模型实例只有满足一定的规则条件后才被创建,不满足条件的数据不会存入到数据库。下例增加了一个对员工年龄的约束,只有大于18岁的才能注册。

Django项目如何给数据库添加约束

注意

无论你使用UniqueConstraint还是CheckConstraint都必须给它取一个独一无二的名字。

小结

前后端数据验证并不能总是保证数据库里数据的有效性和完整性。Django中可以通过Meta.constraints选项轻松定义数据库层面的UniqueConstraint(唯一约束)和CheckConstraint(条件约束)。新知识学到了吗?欢迎留言。

来源:https://mp.weixin.qq.com/s/RBI0UCcVKoVh0z96w343eg

标签:Django,数据库,约束
0
投稿

猜你喜欢

  • python提取word文件中的图片并上传阿里云OSS

    2021-02-01 10:52:25
  • 纯CSS去除按钮以及链接点击时虚线

    2009-05-21 10:40:00
  • 详解MySQL性能优化(二)

    2024-01-23 13:10:47
  • Python实现Socket通信建立TCP反向连接

    2023-11-13 04:20:19
  • mysql数据库远程访问设置方法

    2024-01-14 11:25:34
  • js实现本地持久化存储登录注册

    2024-04-16 10:35:05
  • 使用python获取csv文本的某行或某列数据的实例

    2021-06-13 14:11:20
  • Python lxml库的简单介绍及基本使用讲解

    2022-09-12 07:40:55
  • vue中点击切换按钮功能之点启用后按钮变为禁用

    2023-07-02 16:51:56
  • 78行Python代码实现现微信撤回消息功能

    2021-12-17 17:41:19
  • 使用Python的datetime库处理时间(RPA流程)

    2023-04-23 22:53:15
  • vue实现移动端轻量日期组件不依赖第三方库的方法

    2024-05-29 22:29:03
  • Python之父谈Python的未来形式

    2022-02-05 11:10:42
  • 《悟透JavaScript》之 甘露模型

    2008-06-09 14:03:00
  • python中decimal模块的用法

    2021-01-20 06:54:57
  • Java基础MAC系统下IDEA连接MYSQL数据库JDBC过程

    2024-01-20 10:41:56
  • Python通过Manager方式实现多个无关联进程共享数据的实现

    2021-12-27 04:03:17
  • sql server中批量插入与更新两种解决方案分享(存储过程)

    2012-05-22 18:29:59
  • Vue CLI3.0中使用jQuery和Bootstrap的方法

    2023-07-02 17:08:15
  • JavaScript数组的5种迭代方法

    2024-04-22 22:17:42
  • asp之家 网络编程 m.aspxhome.com