Как применить условный оператор И с использованием объектов Q - PullRequest
0 голосов
/ 09 июля 2020

У меня следующая модель:

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 голосов
/ 09 июля 2020

Чтобы помочь тем в будущем, правильный подход:

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