- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Django项目如何给数据库添加约束由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
只要你的Web开发知识不是语文老师教的,那么你应该已经知道一个合格的开发者应该永远抱着怀疑的眼光看用户提交的数据。你不仅需要在前端通过表单或其它方式进行验证,还需要在后台视图拿到用户发送的数据后再对其进行验证一遍。假如有一天你开发一个少儿不宜的网站,你的用户模型里有年龄(age)这个字段而你要求每个注册用户年龄都大于18岁,在Django中你当然可以自定义表单的clean方法, 自定义validators或者重写模型的save方法对年龄字段进行验证。然而你想过没有一件事没有?这能阻止某个员工或用户通过Django的admin后台或数据库可视化工具对数据库进行修改,把用户的年龄修改到18岁以下吗?当然不能.
划重点:前后端的数据验证并不能保证数据库里数据的正确性和有效性,在数据库层面添加一些约束条件是最根本的解决方法.
今天我们就来看下如何在Django项目中给数据库添加约束(Constraints).
数据库约束(Contraints)是在数据库层面对表中的数据进行进一步的限制, 保证数据的正确性、有效性和完整性(data integrity)。 约束通常与一个表相关联,并使用CREATE CONSTRAINT或CREATE ASSERTION SQL语句创建。他们定义数据库中的数据必须符合的某些属性。他们可以应用于列,整个表格,多个表格或整个模式.
常见的约束条件有:
在Django中我们可以借助于它的ORM,而不是原始SQL语句创建约束,所以对SQL语句不熟悉的不用担心看不懂本文。not null和primary key这两个约束Django通常在创建数据表时会自动帮你加上,比如primary key永远是唯一的。如果你在定义模型时给某个字段设置了null=True, 那么Django就会取消not null的自动约束.
今天我们着重看下如何添加unique和check这两个常用的数据库约束.
假如我们有如下一个员工(employee)模型,我们希望让姓名(name)和email这个组合变得唯一,我们可以在Meta选项中定义一个unique_together元组。这样Django会自动为你创建数据库约束.
同样需要unique_together的字段组合还有(room, date)等。当你试图注册相同用户名和用户email时,你会得到如下报错:
由于unique_together这个方法将来会被淘汰,Django 2.2后建议在Meta.constraints选项中定义UniqueConstraints。它有两个属性,一是需要unique的字段或字段组合(fields),二是要给它取个名字(name).
条件约束确保一个模型实例只有满足一定的规则条件后才被创建,不满足条件的数据不会存入到数据库。下例增加了一个对员工年龄的约束,只有大于18岁的才能注册.
注意 。
无论你使用UniqueConstraint还是CheckConstraint都必须给它取一个独一无二的名字.
前后端数据验证并不能总是保证数据库里数据的有效性和完整性。Django中可以通过Meta.constraints选项轻松定义数据库层面的UniqueConstraint(唯一约束)和CheckConstraint(条件约束)。新知识学到了吗?欢迎留言.
以上就是Django项目如何给数据库添加约束的详细内容,更多关于Django 给数据库添加约束的资料请关注我其它相关文章! 。
原文链接:https://mp.weixin.qq.com/s/RBI0UCcVKoVh0z96w343eg 。
最后此篇关于Django项目如何给数据库添加约束的文章就讲到这里了,如果你想了解更多关于Django项目如何给数据库添加约束的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我可以添加一个检查约束来确保所有值都是唯一的,但允许默认值重复吗? 最佳答案 您可以使用基于函数的索引 (FBI) 来实现此目的: create unique index idx on my_tabl
嗨,我在让我的约束在grails项目中工作时遇到了一些麻烦。我试图确保Site_ID的字段不留为空白,但仍接受空白输入。另外,我尝试设置字段显示的顺序,但即使尝试时也无法反射(reflect)在页面上
我似乎做错了,我正在尝试将一个字段修改为外键,并使用级联删除...我做错了什么? ALTER TABLE my_table ADD CONSTRAINT $4 FOREIGN KEY my_field
阅读目录 1、约束的基本概念 2、约束的案例实践 3、外键约束介绍 4、外键约束展示 5、删除
SQLite 约束 约束是在表的数据列上强制执行的规则。这些是用来限制可以插入到表中的数据类型。这确保了数据库中数据的准确性和可靠性。 约束可以是列级或表级。列级约束仅适用于列,表级约束被应用到整
我在 SerenityOS project 中偶然发现了这段代码: template void dbgln(CheckedFormatString&& fmtstr, const Parameters
我有表 tariffs,有两列:(tariff_id, reception) 我有表 users,有两列:(user_id, reception) 我的表 users_tariffs 有两列:(use
在 Derby 服务器中,如何使用模式的系统表中的信息来创建选择语句以检索每个表的约束名称? 最佳答案 相关手册是Derby Reference Manual .有许多可用版本:10.13 是 201
我正在使用 z3py 进行编码。请参阅以下示例。 from z3 import * x = Int('x') y = Int('y') s = Solver() s.add(x+y>3) if s.c
非常快速和简单的问题。我正在运行一个脚本来导入数据并声明了一个临时表并将检查约束应用于该表。显然,如果脚本运行不止一次,我会检查临时表是否已经存在,如果存在,我会删除并重新创建临时表。这也会删除并重新
我有一个浮点变量 x在一个线性程序中,它应该是 0或两个常量之间 CONSTANT_A和 CONSTANT_B : LP.addConstraint(x == 0 OR CONSTANT_A <= x
我在使用grails的spring-data-neo4j获得唯一约束时遇到了一些麻烦。 我怀疑这是因为我没有正确连接它,但是存储库正在扫描和连接,并且CRUD正在工作,所以我不确定我做错了什么。 我正
这个问题在这里已经有了答案: Is there a constraint that restricts my generic method to numeric types? (24 个回答) 7年前
我有一个浮点变量 x在一个线性程序中,它应该是 0或两个常量之间 CONSTANT_A和 CONSTANT_B : LP.addConstraint(x == 0 OR CONSTANT_A <= x
在iOS的 ScrollView 中将图像和带有动态文本(动态高度)的标签居中的最佳方法是什么? 我必须添加哪些约束?我真的无法弄清楚它是如何工作的,也许我无法处理它,因为我是一名 Android 开
考虑以下代码: class Foo f class Bar b newtype D d = D call :: Proxy c -> (forall a . c a => a -> Bool) ->
我有一个类型类,它强加了 KnownNat约束: class KnownNat (Card a) => HasFin a where type Card a :: Nat ... 而且,我有几
我知道REST原则上与HTTP无关。 HTTP是协议,REST是用于通过Web传输hypermedia的体系结构样式。 REST可以使用诸如HTTP,FTP等的任何应用程序层协议。关于REST的讨论很
我有这样的情况,我必须在数据库中存储复杂的数据编号。类似于 21/2011,其中 21 是文件编号,但 2011 是文件年份。所以我需要一些约束来处理唯一性,因为有编号为 21/2010 和 21/2
我有一个 MySql (InnoDb) 表,表示对许多类型的对象之一所做的评论。因为我正在使用 Concrete Table Inheritance ,对于下面显示的每种类型的对象(商店、类别、项目)
我是一名优秀的程序员,十分优秀!