代码之家  ›  专栏  ›  技术社区  ›  maxp

带有“忽略大小写”的唯一约束

  •  4
  • maxp  · 技术社区  · 17 年前

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

    像那样

    create table t
    (
      login varchar(10),
      unique ( upper(login) )
    );
    
    1 回复  |  直到 17 年前
        1
  •  6
  •   Jarret Hardie    17 年前

    贾戈 unique unique_together 支持是在数据库级别处理的,因此,由于非常依赖于数据库,django不支持在约束中使用数据库函数(并非所有DBS都可以支持它,或一致支持它,等等)。但是,您有几个选择:

    代码方式

    如果维护数据库可移植性很重要,请重写 save() 方法,并在代码中执行检查。这显然是一个性能消耗,因为在发布更新/插入之前必须发出一个查询,但是和所有与性能相关的事情一样,最好先尝试最简单的解决方案,然后看看应用程序和部署环境是否真的存在性能问题。(这实际上就是亚当·贝尼尔在问题评论中指出的“Django检查约束”项目所做的……只是在抽象层次上你可能不需要)。

    SQL方式

    或者,如果您不太关心数据库的可移植性,或者愿意为需要支持的所有数据库编写适当的SQL,那么可以利用Django的钩子在 CREATE TABLE 为模型运行。Django文档在这里介绍: Providing Initial SQL Data .

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