Объекты Django Q в ограничениях модели

Я пытаюсь расширить модель в Django App. Единственная проблема, с которой я столкнулся, заключается в том, что мне нужно расширить также и ограничения модели, а это не работает должным образом.

Это исходное ограничение для объекта в models.py:

 models.CheckConstraint(
                check=(
                    models.Q(inventory_item__isnull=True, device_type__isnull=False)
                    | models.Q(inventory_item__isnull=False, device_type__isnull=True)
                ),
                name="At least one of InventoryItem or DeviceType specified.",
            )

Я пытался расширить его таким образом:

 models.CheckConstraint(
                check=(
                    models.Q(inventory_item__isnull=True, 
                             device_type__isnull=False,
                             module_type__isnull=False)
                    | models.Q(inventory_item__isnull=False, 
                             device_type__isnull=True,
                             module_type__isnull=False)
                    | models.Q(inventory_item__isnull=False, 
                             device_type__isnull=False,
                             module_type__isnull=True)
                ),
                name="At least one of InventoryItem, ModuleType or DeviceType specified.",
            ),

Вот как это выглядит в миграции:

migrations.AddConstraint(
            model_name='hardwarelcm',
            constraint=models.CheckConstraint(check=models.Q(models.Q(('device_type__isnull', False), ('inventory_item__isnull', True), ('module_type__isnull', False)), models.Q(('device_type__isnull', True), ('inventory_item__isnull', False), ('module_type__isnull', False)), models.Q(('device_type__isnull', False), ('inventory_item__isnull', False), ('module_type__isnull', True)), _connector='OR'), name='At least one of InventoryItem or ModelType or DeviceType specified.'),
        )

Моя проблема в том, что я пробовал все комбинации, и каждый раз ничего не получается, но из сообщения об ошибке видно, что установлено только одно значение, а остальные - Null.

DETAIL: Failling row contains (3, null, 1, null)

Есть ли какое-то ограничение с объектами Q, которое я не понимаю? Я пытался читать документацию Django, но не смог понять, в чем проблема.

Ваше условие делает обратное: оно требует, чтобы два предмета не были None. Вы должны сделать проверку с:

from django.db.models import Q

models.CheckConstraint(
    check=Q(inventory_item=None, device_type=None, module_type__isnull=False) |
          Q(inventory_item=None, device_type__isnull=False, module_type=None) |
          Q(inventory_item__isnull=False, device_type=None, module_type=None),
    name='At least one of InventoryItem, ModuleType or DeviceType specified.'
)

Это означает, что вы можете указать точно один. Если вы хотите указать не менее одного, вы можете работать с:

from django.db.models import Q

models.CheckConstraint(
    check=Q(
        inventory_item__isnull=False,
        device_type__isnull=False,
        module_type__isnull=False,
        _connector=Q.OR
    ),
    name='At least one of InventoryItem, ModuleType or DeviceType specified.'
)
Вернуться на верх