如何使用Q对象应用条件AND语句

时间:2020-07-08 23:40:34

标签: python django django-models

我有以下模型:

Contact(models.Model):
    personal_id = models.CharField()
    personal_id_type = models.SmallIntegerField()

我想应用CheckConstraint来确保如果IntegrityError不是personal_id并且null时抛出personal_id_type = 0

使用伪代码:

if personal_id != None and personal_id_type == 0:
    fail

我尝试使用以下Q对象实现这一目标:

class Meta:
    constraints = [
         models.CheckConstraint(check=~Q(personal_id__isnull=False) &
                                         ~Q(personal_id_type=0),
                                   name='personal_id_type_0__personal_id_isnotnull')
        ]

但这会导致以下SQL检查

NOT personal_id IS NOT NULL AND NOT (personal_id_type = 0 AND personal_id_type IS NOT NULL)

如何将其简化为NOT (personal_id_type = 0 AND personal_id_type IS NOT NULL)

1 个答案:

答案 0 :(得分:0)

为将来提供帮助,正确的方法是:

        models.CheckConstraint(
            check=(~Q(personal_id__isnull=False, personal_id_type=0)),
            name='personal_id_type_0__personal_id_isnotnull'
        )
相关问题