4

如何为 Django 模型指定自定义约束?

像那样

create table t
(
  login varchar(10),
  unique ( upper(login) )
);
4

1 回答 1

6

Django 的uniqueunique_together支持是在数据库级别处理的,因此非常依赖于数据库,Django 不支持在约束中使用数据库函数(并非所有数据库都支持它,或者一致地支持它等等)。但是,您确实有几个选择:

代码方式

如果维护数据库可移植性很重要,请覆盖save()模型类中的方法并在代码中执行检查。这显然是一种性能消耗,因为您必须在发出更新/插入之前发出查询,但与所有与性能相关的事情一样,最好先尝试最简单的解决方案,然后看看是否真的存在性能问题您的应用程序和部署环境。(这实际上是 Adam Bernier 在问题评论中指出的“django-check-constraints”项目正在做的事情......只是具有您可能不需要的抽象级别)。

SQL方式

或者,如果您不太关心数据库的可移植性,或者很乐意为您需要支持的所有数据库编写适当的 SQL,您可以利用 Django 的钩子CREATE TABLE在模型运行后运行自定义 SQL 语句. django 文档在这里介绍了它:提供初始 SQL 数据

虽然文档中的示例,如标题所示,用于使用 SQL 填充初始数据,但您可以将任何 SQL 语句集放入文件中,包括ALTER TABLE在创建表后立即使用函数引入 DB 管理约束的命令. Django 允许您为您支持的每种数据库类型提供单独的 SQL 语句。

于 2009-04-05T17:04:37.507 回答