'忽略大小写'的唯一约束

max*_*axp 4 django postgresql constraints

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

像那样

create table t
(
  login varchar(10),
  unique ( upper(login) )
);
Run Code Online (Sandbox Code Playgroud)

Jar*_*die 6

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

守则方式

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

SQL方式

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

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