如何为 Django 模型指定自定义约束?
像那样
create table t
(
login varchar(10),
unique ( upper(login) )
);
如何为 Django 模型指定自定义约束?
像那样
create table t
(
login varchar(10),
unique ( upper(login) )
);
Django 的unique
和unique_together
支持是在数据库级别处理的,因此非常依赖于数据库,Django 不支持在约束中使用数据库函数(并非所有数据库都支持它,或者一致地支持它等等)。但是,您确实有几个选择:
代码方式
如果维护数据库可移植性很重要,请覆盖save()
模型类中的方法并在代码中执行检查。这显然是一种性能消耗,因为您必须在发出更新/插入之前发出查询,但与所有与性能相关的事情一样,最好先尝试最简单的解决方案,然后看看是否真的存在性能问题您的应用程序和部署环境。(这实际上是 Adam Bernier 在问题评论中指出的“django-check-constraints”项目正在做的事情......只是具有您可能不需要的抽象级别)。
SQL方式
或者,如果您不太关心数据库的可移植性,或者很乐意为您需要支持的所有数据库编写适当的 SQL,您可以利用 Django 的钩子CREATE TABLE
在模型运行后运行自定义 SQL 语句. django 文档在这里介绍了它:提供初始 SQL 数据。
虽然文档中的示例,如标题所示,用于使用 SQL 填充初始数据,但您可以将任何 SQL 语句集放入文件中,包括ALTER TABLE
在创建表后立即使用函数引入 DB 管理约束的命令. Django 允许您为您支持的每种数据库类型提供单独的 SQL 语句。