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