【问题标题】:Q object for CheckConstraintCheckConstraint 的 Q 对象
【发布时间】:2020-10-18 07:19:24
【问题描述】:

我正在尝试写一个 Q 对象说

这4个字段中的一个不为空,或者该字段不为真

我有一个包含 4 类价格和一个可用标志的标准化表

price_A
price_B
price_C
price_D
available_on_the_store

在可以使用 Q 对象在 CheckConstraint 上将其标记为 available_on_the_store 之前,我希望至少填充其中一个价格

我可以很容易地用一个巨大的 Q 链来做到这一点,或者可以很容易地在 .clean() 中编写它并在 python 端强制它,但我希望它在数据库级别;所以请相应地回答。

【问题讨论】:

    标签: python python-3.x django django-models django-orm


    【解决方案1】:

    你可以这样写:

      Q(available_on_the_store=False) |
      Q(price_A__isnull=False) |
      Q(price_B__isnull=False) |
      Q(price_C__isnull=False) |
      Q(price_D__isnull=False)

    或者我们可以写得更短:

    Q(
        ('available_on_the_store', False),
        ('price_A__isnull', False),
        ('price_B__isnull', False),
        ('price_C__isnull', False),
        ('price_D__isnull', False),
        _connector=Q.OR
    )

    因此,您可以制作如下所示的模型:

    class MyModel(models.Model):
        # …
    
        class Meta:
            constraints = [
                models.CheckConstraint(
                    Q(
                        ('available_on_the_store', False),
                        ('price_A__isnull', False),
                        ('price_B__isnull', False),
                        ('price_C__isnull', False),
                        ('price_D__isnull', False),
                        _connector=Q.OR
                    ),
                    name='one_price_not_null_if_avaiable'
                )
            ]

    【讨论】:

    • 当所有价格字段为空时,我似乎可以将其标记为available_on_the_store=True,而obj.save() 似乎根本没有抱怨。应该抛出 IntegrityError 什么的吧?
    • @Işık Kaplan:并非所有数据库都实际检查约束,例如 MySQL 5.7 的免费版本没有实现(它忽略了约束)。您还需要运行迁移以添加约束(并且数据库应该像所说的那样支持检查约束(并且应该启用)。
    • 我在psql上,它已经被迁移了;并且 uniqueconstraints 似乎默认工作,我应该启用 CheckConstraints 工作吗?
    • @IşıkKaplan:如果你运行manage.py sqlmigrate app_name migration_name 会怎样?你能看到约束吗?你能编辑问题并包含 SQL 迁移吗?
    • 完成,看起来很奇怪;为什么它说 =0 而不是某种空指示符,idk sql 所以这有点令人困惑哈哈。
    猜你喜欢
    • 2015-04-13
    • 2015-04-21
    • 2017-09-16
    • 2016-06-23
    • 2013-05-30
    • 2016-01-05
    • 2011-03-22
    • 2015-03-14
    • 2015-05-13
    相关资源
    最近更新 更多