From 71756bdfed5029bd14dce8cb3c5629efc4be55ac Mon Sep 17 00:00:00 2001 From: Simon Charette Date: Fri, 31 Jan 2020 01:38:48 -0500 Subject: [PATCH] Fixed #31055 -- Made constraint checks support databases aware. --- django/db/models/base.py | 7 ++++--- tests/invalid_models_tests/test_models.py | 8 ++++---- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/django/db/models/base.py b/django/db/models/base.py index 24453e218a4..1d98ff407bc 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -1255,6 +1255,7 @@ class Model(metaclass=ModelBase): def check(cls, **kwargs): errors = [*cls._check_swappable(), *cls._check_model(), *cls._check_managers(**kwargs)] if not cls._meta.swapped: + databases = kwargs.get('databases') or [] errors += [ *cls._check_fields(**kwargs), *cls._check_m2m_through_same_relationship(), @@ -1277,7 +1278,7 @@ class Model(metaclass=ModelBase): *cls._check_unique_together(), *cls._check_indexes(), *cls._check_ordering(), - *cls._check_constraints(), + *cls._check_constraints(databases), ] return errors @@ -1836,9 +1837,9 @@ class Model(metaclass=ModelBase): return errors @classmethod - def _check_constraints(cls): + def _check_constraints(cls, databases): errors = [] - for db in settings.DATABASES: + for db in databases: if not router.allow_migrate_model(db, cls): continue connection = connections[db] diff --git a/tests/invalid_models_tests/test_models.py b/tests/invalid_models_tests/test_models.py index ec2d345d5a9..4d2a923a007 100644 --- a/tests/invalid_models_tests/test_models.py +++ b/tests/invalid_models_tests/test_models.py @@ -6,7 +6,7 @@ from django.core.checks.model_checks import _check_lazy_references from django.db import connection, connections, models from django.db.models.functions import Lower from django.db.models.signals import post_init -from django.test import SimpleTestCase +from django.test import SimpleTestCase, TestCase from django.test.utils import isolate_apps, override_settings, register_lookup @@ -1212,7 +1212,7 @@ class OtherModelTests(SimpleTestCase): @isolate_apps('invalid_models_tests') -class ConstraintsTests(SimpleTestCase): +class ConstraintsTests(TestCase): def test_check_constraints(self): class Model(models.Model): age = models.IntegerField() @@ -1220,7 +1220,7 @@ class ConstraintsTests(SimpleTestCase): class Meta: constraints = [models.CheckConstraint(check=models.Q(age__gte=18), name='is_adult')] - errors = Model.check() + errors = Model.check(databases=self.databases) warn = Warning( '%s does not support check constraints.' % connection.display_name, hint=( @@ -1230,7 +1230,7 @@ class ConstraintsTests(SimpleTestCase): obj=Model, id='models.W027', ) - expected = [] if connection.features.supports_table_check_constraints else [warn, warn] + expected = [] if connection.features.supports_table_check_constraints else [warn] self.assertCountEqual(errors, expected) def test_check_constraints_required_db_features(self):