如何在Django中将paren添加到CheckConstraint
以下约束条件:如何在Django中将paren添加到CheckConstraint,django,postgresql,Django,Postgresql,以下约束条件: models.CheckConstraint(name='approved_by_someone', check=(models.Q(approved_at__isnull=True) | (models.Q(approved_by__isnull=False)
models.CheckConstraint(name='approved_by_someone',
check=(models.Q(approved_at__isnull=True)
| (models.Q(approved_by__isnull=False)
& models.Q(approved_at__isnull=False))))
生成如下所示的postgres约束:
Check constraints:
"approved_by_someone" CHECK (approved_at IS NULL OR approved_by_id IS NOT NULL AND approved_at IS NOT NULL)
当转换为sql约束时,python代码中的参数将消失。我的第一个想法是,好吧,我可以通过添加一个模型将它们放回原处。Q关于和条件:
models.CheckConstraint(name='approved_by_someone',
check=(models.Q(approved_at__isnull=True)
| models.Q(models.Q(approved_by__isnull=False)
& models.Q(approved_at__isnull=False))))
但是,没有任何约束是不变的。@willem van onsem是正确的,优先顺序使上述内容正确无需排列。他还正确地认为,拥有帕伦夫妇有利于人类的精神状态:——)
所以我猜你需要
models.Q
围绕表达式,表达式需要paren在SQL中实际获取它们。不,括号只是Python文件的一部分,所以可以说,在解析之后,它们甚至不再可用。ORM显然不认为这些是必要的。和
优先于或
,因此它的书写方式是正确的:尽管我同意让它更明确可能更好。