Python CheckConstraint的Q对象
我试着写一个Q对象,它说 这4个字段中有一个不为空,或者此字段不为真 我有一个标准化的表,有4类价格,还有一个可用的标志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端强制执行它,但我希望它在数据库级别;因此,请相应地回答。您可以这
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'
)
]