Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python CheckConstraint的Q对象_Python_Python 3.x_Django_Django Models_Django Orm - Fatal编程技术网

Python CheckConstraint的Q对象

Python CheckConstraint的Q对象,python,python-3.x,django,django-models,django-orm,Python,Python 3.x,Django,Django Models,Django Orm,我试着写一个Q对象,它说 这4个字段中有一个不为空,或者此字段不为真 我有一个标准化的表,有4类价格,还有一个可用的标志 price_A price_B price_C price_D available_on_the_store 我希望在使用Q对象将CheckConstraint上的存储标记为可用之前,至少填充其中一个价格 我可以很容易地用一个巨大的Q链来实现这一点,或者可以很容易地在.clean()中编写它,并在python端强制执行它,但我希望它在数据库级别;因此,请相应地回答。您可以这

我试着写一个Q对象,它说

这4个字段中有一个不为空,或者此字段不为真

我有一个标准化的表,有4类价格,还有一个可用的标志

price_A
price_B
price_C
price_D
available_on_the_store
我希望在使用Q对象将CheckConstraint上的存储标记为可用之前,至少填充其中一个价格

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

您可以这样写:

  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
)

当所有价格字段都为空时,我似乎能够在存储=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,所以这有点让人困惑哈哈。
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'
            )
        ]