问题标签 [django-constraints]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
django - 使用 ValidationError 和 Constraint(Django 2.2 中的新功能)时的最佳实践是什么?
编辑:我正在使用 PostgreSQL
我有一个具有 4 个电话号码字段的模型,并且我在模型级别运行 ValidationError 使用clean
:
这按预期工作正常。
在 Django 2.2 中,引入了模型约束,它在数据库级别创建约束。
最佳做法是:
- 将模型替换
ValidationError
为Constraint
- 仅使用
ValidationErrors
(我不确定上述逻辑是否可以使用Constraint
?) - 保留两个?
如果答案是 1 或 3,我将如何ValidationError
在 a 中创建与 my 相同的逻辑Constraint
?
django - 使用带有注解的 Django CheckConstraint
我有一个 Django 模型,其中每个实例都需要一个从三个字段派生的唯一标识符:
这会产生一个形式为 的标签[type][timestamp YEAR][number]
,它必须是唯一的,除非number
为空。
我想我也许可以使用几个注释:
我覆盖了模型的管理器get_queryset
以默认应用注释,然后尝试使用CheckConstraint
:
这失败了,因为它无法在名为 的实例上找到一个字段uid_cnt
,但是我认为对象可以访问注释Q
。它看起来像是CheckConstraint
直接对模型进行查询,而不是使用管理器返回的查询集:
有没有办法将约束应用于注释?还是有更好的方法?
我真的很想在 db 层执行此操作。
谢谢。
django - 如何在 django 中使用 Uniqueconstraints 函数创建 unique_together 索引?
官方文档说:UniqueConstraint 提供了比 unique_together 更多的功能。unique_together 将来可能会被弃用。这是我的代码
当我迁移时,它会创建一个带有消息“-在模型 helloWorld 上创建约束 hello”的迁移。但它没有在数据库上创建索引。
django - django 具有相同外键的多个模型
我有 django 应用程序,用于跟踪各种客户的合同、位置和产品。合同、位置每个都使用 ForeignKey 引用客户端。
我还有一个产品将部署在一个位置,根据合同,为客户。我需要在产品中包含客户,因为参考用于保护该客户的记录。
确保永远不会创建包含所有 3 个模型的不同客户参考的产品的最佳方法是什么?我在想我可以使用 pre_save 信号,但我宁愿使用数据库约束,但我没有看到数据库约束来强制执行此操作。
sql - 在这种复杂情况下,如何解决 Django 缺少组合键的问题?
对于以下情况,我似乎无法弄清楚如何解决 Django 中缺少复合键的问题。我将使用 SQLite3 方言编写我想要的架构。
(对于了解 SQL 但不了解 sqlite 的人来说,下面唯一可能不熟悉的是 sqlite 的“WITHOUT ROWID”子句。默认情况下,sqlite 在表上添加一个隐藏的整数自动递增“rowid”列。使用“WITHOUT ROWID”命令将其关闭。)
表 AB 和 BC 具有复合键约束,可以使用代理键轻松解决,但表 ABC 具有复杂的键约束,不能直接在 Django 中实现。
这是一些测试数据
尝试让它工作 Django 的显而易见的第一步是使用代理键。隐藏的“rowid”列似乎是一个自然的选择,但这些列不能用作sqlite 中的外键,其中外键必须映射到声明的列。但是,有一种解决方法,“INTEGER PRIMARY KEY AUTOINCREMENT”是sqlite 中的一个特殊别名,它会导致命名列引用“rowid”。所以这就是我们将尝试的。
StackOverflow 上关于 Django 和复合键的类似问题提到使用 NOT NULL 和 UNIQUE 约束,因此我们也可以这样做:
如表所示,ABC 是欠约束的。这是相同的测试数据来证明它(在插入时使用 NULL 来表示自增列):
是在插入触发器之前使用的唯一选项来测试否则会漏掉的值吗?使用 Django 约束,我发现无法在约束检查中引用表 AB 和 BC。
django - 确保字段对于 Django 模型中的另一个字段是唯一的
我希望模型中的一个字段基于另一个字段是唯一的,反之亦然。
例如:
我希望两批货物不能有相同的供应商和相同的 external_id,但可以有相同的 external_id 和不同的供应商,或者相同的供应商和不同的 external_id。
我知道unique_together。但它使供应商只有一个 external_id。但是,我希望供应商拥有多个 external_id,而它们都是唯一的。
我可以在 save() 方法中检查这个约束,但我想要一个数据库约束,或者更聪明的东西。
django - Django Concat 不能在 AddConstraint 中使用
我有这样的约束
Makemigrations 运行良好,但是当我尝试实际迁移生成的迁移时,我得到IndexError: tuple index out of range
当我为生成的迁移运行 sqlmigrations 时,我收到以下错误TypeError: not enough arguments for format string
。
这是完整的错误消息:
django 在这里尝试格式化的字符串是:
元组是空的
我尝试了以下方法来排除简单的愚蠢:
- 在注释中使用
Concat(Value("/"), F("identifier"), Value("/"))
,这就像一个魅力 - 替换
Value("/")
为"/"
,正如预期的那样,这本身会产生问题 - 用一个简单的值替换约束中的 concat,这也有效
所以看起来所有的拼图都是分开工作的!
如果重要的话,我正在使用 django 2.2.9
django - Django 单元测试约束
所以我在为 Check 和 Unique 约束编写单元测试时遇到了问题。以下是它们的定义:
并且单元测试断言失败:
和追溯:
django - 为什么我的模型字段超出了约束范围?
模型.py
当我尝试对其运行测试时,出现以下错误:
NameError: name 'created_at' is not defined
我试图强制执行一个约束,即created_at
错误的日期要么恰好是它的创建时间,要么在它创建时间的某个严格范围内。我希望在数据库级别执行它,因为我试图保护数据不仅来自表单输入(在这种情况下,我可以添加一个验证器或在字段上添加 editable=false),而且还来自任何其他尝试通过 ORM 将不正确的数据保存到数据库中。我还使用约束而不是验证器,因为我不想重写多个函数(save()、update() 等)。
系统信息:Python v3.9.0、Django v3.1.4
django - Django:如何将 null 视为等于唯一性约束的所有内容?
在标题中,我的意思是等于任何值,而不仅仅是其他空值。
假设我们有一个家庭,有家庭成员(人)和电子设备。有些电子设备是个人的,属于一个人,但有些不属于任何一个家庭成员,例如书房中的一台普通计算机。然后我们可以像这样对电子设备进行建模:
现在假设我们希望设备名称从家庭成员的角度来看是唯一的。一个家庭成员不应该有两个具有相同名称的设备可供他们使用。所以 name 和 owner 一起应该是唯一的,但也不应该有两个设备,一个 private 和一个 common(owner 为 null)具有相同的名称。
因此一个正常的UniqueConstraint
:
不会这样做,因为如果其中一个设备的所有者为空,它仍然允许两个设备具有相同的名称。仅约束名称字段:
也不会这样做,因为这不允许两个家庭成员将他们的私人设备命名相同,尽管我们确实希望允许这样做。
我目前的尝试是限制名称和所有者的唯一性,然后CheckConstraint
如果已经存在具有该名称的通用设备(所有者为空),则使用不允许名称:
这是这里最好的方法还是有更好的解决方案?如果这是最好的解决方案:如何为此编写CheckConstraint
?