Объекты 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.'
)