0

我想在使用字段 one='a' 和 two='b' 创建对象之前检查数据库,如果数据库已经有字段 one='b' 和 two=' 的行,则不创建(抛出异常) a'(倒序)。即保证(一,二)和(二,一)中只有一个存在。这就像一个广义的唯一性约束。

我正在使用 Django 3.2。

我看到CheckConstraint支持 boolean Expression,一种类型的表达式是聚合。所以我可以想象测试 (one, two) 和 (two, one) 的行数最多为 1。但是,这听起来很昂贵,而且我也没有看到如何在 CheckConstraint 中使用 Count 的示例.

或者,我可以实现一个发出查询的pre_save信号。这似乎更好,因为我手头有数据来形成查询。但是,我看不到如何使用 pre_save 信号来防止保存。它有我可以使用的返回值吗?我在文档中没有看到。

编辑:第三种选择可能会覆盖save进行检查。

我也对其他想法持开放态度。

4

1 回答 1

0

我想不出任何允许这种类型约束的数据库级约束。

所以约束可以在应用程序级别实现。您是否在提交表单时创建模型?在这种情况下,您可以在表单验证代码中检查数据库中的现有行。

于 2021-09-18T02:42:01.507 回答