CheckConstraint的Q对象

2024-06-10 17:16:29 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Either one of these 4 fields is not null, or this field is not true

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

price_A
price_B
price_C
price_D
available_on_the_store

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

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


Tags: orof对象truefieldfieldsisnot
1条回答
网友
1楼 · 发布于 2024-06-10 17:16:29

您可以这样写:

  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'
            )
        ]

相关问题 更多 >