Refs #11964 -- Changed CheckConstraint() signature to use keyword-only arguments.
Also renamed the `constraint` argument to `check` to better represent which part of the constraint the provided `Q` object represents.
This commit is contained in:
parent
0bf7b25f8f
commit
9142bebff2
|
@ -4,13 +4,13 @@ __all__ = ['CheckConstraint']
|
||||||
|
|
||||||
|
|
||||||
class CheckConstraint:
|
class CheckConstraint:
|
||||||
def __init__(self, constraint, name):
|
def __init__(self, *, check, name):
|
||||||
self.constraint = constraint
|
self.check = check
|
||||||
self.name = name
|
self.name = name
|
||||||
|
|
||||||
def constraint_sql(self, model, schema_editor):
|
def constraint_sql(self, model, schema_editor):
|
||||||
query = Query(model)
|
query = Query(model)
|
||||||
where = query.build_where(self.constraint)
|
where = query.build_where(self.check)
|
||||||
connection = schema_editor.connection
|
connection = schema_editor.connection
|
||||||
compiler = connection.ops.compiler('SQLCompiler')(query, connection, 'default')
|
compiler = connection.ops.compiler('SQLCompiler')(query, connection, 'default')
|
||||||
sql, params = where.as_sql(compiler, connection)
|
sql, params = where.as_sql(compiler, connection)
|
||||||
|
@ -35,19 +35,19 @@ class CheckConstraint:
|
||||||
}
|
}
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "<%s: constraint='%s' name='%s'>" % (self.__class__.__name__, self.constraint, self.name)
|
return "<%s: check='%s' name=%r>" % (self.__class__.__name__, self.check, self.name)
|
||||||
|
|
||||||
def __eq__(self, other):
|
def __eq__(self, other):
|
||||||
return (
|
return (
|
||||||
isinstance(other, CheckConstraint) and
|
isinstance(other, CheckConstraint) and
|
||||||
self.name == other.name and
|
self.name == other.name and
|
||||||
self.constraint == other.constraint
|
self.check == other.check
|
||||||
)
|
)
|
||||||
|
|
||||||
def deconstruct(self):
|
def deconstruct(self):
|
||||||
path = '%s.%s' % (self.__class__.__module__, self.__class__.__name__)
|
path = '%s.%s' % (self.__class__.__module__, self.__class__.__name__)
|
||||||
path = path.replace('django.db.models.constraints', 'django.db.models')
|
path = path.replace('django.db.models.constraints', 'django.db.models')
|
||||||
return (path, (), {'constraint': self.constraint, 'name': self.name})
|
return (path, (), {'check': self.check, 'name': self.name})
|
||||||
|
|
||||||
def clone(self):
|
def clone(self):
|
||||||
_, args, kwargs = self.deconstruct()
|
_, args, kwargs = self.deconstruct()
|
||||||
|
|
|
@ -23,20 +23,20 @@ explains the API references of :class:`CheckConstraint`.
|
||||||
``CheckConstraint`` options
|
``CheckConstraint`` options
|
||||||
===========================
|
===========================
|
||||||
|
|
||||||
.. class:: CheckConstraint(constraint, name)
|
.. class:: CheckConstraint(*, check, name)
|
||||||
|
|
||||||
Creates a check constraint in the database.
|
Creates a check constraint in the database.
|
||||||
|
|
||||||
``constraint``
|
``check``
|
||||||
--------------
|
---------
|
||||||
|
|
||||||
.. attribute:: CheckConstraint.constraint
|
.. attribute:: CheckConstraint.check
|
||||||
|
|
||||||
A :class:`Q` object that specifies the condition you want the constraint to
|
A :class:`Q` object that specifies the check you want the constraint to
|
||||||
enforce.
|
enforce.
|
||||||
|
|
||||||
For example ``CheckConstraint(Q(age__gte=18), 'age_gte_18')`` ensures the age
|
For example ``CheckConstraint(check=Q(age__gte=18), name='age_gte_18')``
|
||||||
field is never less than 18.
|
ensures the age field is never less than 18.
|
||||||
|
|
||||||
``name``
|
``name``
|
||||||
--------
|
--------
|
||||||
|
|
|
@ -469,7 +469,7 @@ Django quotes column and table names behind the scenes.
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
constraints = [
|
constraints = [
|
||||||
models.CheckConstraint(models.Q(age__gte=18), 'age_gte_18'),
|
models.CheckConstraint(check=models.Q(age__gte=18), name='age_gte_18'),
|
||||||
]
|
]
|
||||||
|
|
||||||
``verbose_name``
|
``verbose_name``
|
||||||
|
|
|
@ -9,7 +9,7 @@ class Product(models.Model):
|
||||||
class Meta:
|
class Meta:
|
||||||
constraints = [
|
constraints = [
|
||||||
models.CheckConstraint(
|
models.CheckConstraint(
|
||||||
models.Q(price__gt=models.F('discounted_price')),
|
check=models.Q(price__gt=models.F('discounted_price')),
|
||||||
'price_gt_discounted_price'
|
name='price_gt_discounted_price',
|
||||||
)
|
),
|
||||||
]
|
]
|
||||||
|
|
|
@ -6,22 +6,22 @@ from .models import Product
|
||||||
|
|
||||||
class CheckConstraintTests(TestCase):
|
class CheckConstraintTests(TestCase):
|
||||||
def test_repr(self):
|
def test_repr(self):
|
||||||
constraint = models.Q(price__gt=models.F('discounted_price'))
|
check = models.Q(price__gt=models.F('discounted_price'))
|
||||||
name = 'price_gt_discounted_price'
|
name = 'price_gt_discounted_price'
|
||||||
check = models.CheckConstraint(constraint, name)
|
constraint = models.CheckConstraint(check=check, name=name)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
repr(check),
|
repr(constraint),
|
||||||
"<CheckConstraint: constraint='{}' name='{}'>".format(constraint, name),
|
"<CheckConstraint: check='{}' name='{}'>".format(check, name),
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_deconstruction(self):
|
def test_deconstruction(self):
|
||||||
constraint = models.Q(price__gt=models.F('discounted_price'))
|
check = models.Q(price__gt=models.F('discounted_price'))
|
||||||
name = 'price_gt_discounted_price'
|
name = 'price_gt_discounted_price'
|
||||||
check = models.CheckConstraint(constraint, name)
|
constraint = models.CheckConstraint(check=check, name=name)
|
||||||
path, args, kwargs = check.deconstruct()
|
path, args, kwargs = constraint.deconstruct()
|
||||||
self.assertEqual(path, 'django.db.models.CheckConstraint')
|
self.assertEqual(path, 'django.db.models.CheckConstraint')
|
||||||
self.assertEqual(args, ())
|
self.assertEqual(args, ())
|
||||||
self.assertEqual(kwargs, {'constraint': constraint, 'name': name})
|
self.assertEqual(kwargs, {'check': check, 'name': name})
|
||||||
|
|
||||||
@skipUnlessDBFeature('supports_table_check_constraints')
|
@skipUnlessDBFeature('supports_table_check_constraints')
|
||||||
def test_database_constraint(self):
|
def test_database_constraint(self):
|
||||||
|
|
|
@ -1003,7 +1003,7 @@ class ConstraintsTests(SimpleTestCase):
|
||||||
age = models.IntegerField()
|
age = models.IntegerField()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
constraints = [models.CheckConstraint(models.Q(age__gte=18), 'is_adult')]
|
constraints = [models.CheckConstraint(check=models.Q(age__gte=18), name='is_adult')]
|
||||||
|
|
||||||
errors = Model.check()
|
errors = Model.check()
|
||||||
warn = Warning(
|
warn = Warning(
|
||||||
|
|
|
@ -65,7 +65,7 @@ class AutodetectorTests(TestCase):
|
||||||
("id", models.AutoField(primary_key=True)),
|
("id", models.AutoField(primary_key=True)),
|
||||||
("name", models.CharField(max_length=200)),
|
("name", models.CharField(max_length=200)),
|
||||||
],
|
],
|
||||||
{'constraints': [models.CheckConstraint(models.Q(name__contains='Bob'), 'name_contains_bob')]},
|
{'constraints': [models.CheckConstraint(check=models.Q(name__contains='Bob'), name='name_contains_bob')]},
|
||||||
)
|
)
|
||||||
author_dates_of_birth_auto_now = ModelState("testapp", "Author", [
|
author_dates_of_birth_auto_now = ModelState("testapp", "Author", [
|
||||||
("id", models.AutoField(primary_key=True)),
|
("id", models.AutoField(primary_key=True)),
|
||||||
|
@ -1399,9 +1399,9 @@ class AutodetectorTests(TestCase):
|
||||||
author = ModelState('otherapp', 'Author', [
|
author = ModelState('otherapp', 'Author', [
|
||||||
('id', models.AutoField(primary_key=True)),
|
('id', models.AutoField(primary_key=True)),
|
||||||
('name', models.CharField(max_length=200)),
|
('name', models.CharField(max_length=200)),
|
||||||
], {'constraints': [models.CheckConstraint(models.Q(name__contains='Bob'), 'name_contains_bob')]})
|
], {'constraints': [models.CheckConstraint(check=models.Q(name__contains='Bob'), name='name_contains_bob')]})
|
||||||
changes = self.get_changes([], [author])
|
changes = self.get_changes([], [author])
|
||||||
added_constraint = models.CheckConstraint(models.Q(name__contains='Bob'), 'name_contains_bob')
|
added_constraint = models.CheckConstraint(check=models.Q(name__contains='Bob'), name='name_contains_bob')
|
||||||
# Right number of migrations?
|
# Right number of migrations?
|
||||||
self.assertEqual(len(changes['otherapp']), 1)
|
self.assertEqual(len(changes['otherapp']), 1)
|
||||||
# Right number of actions?
|
# Right number of actions?
|
||||||
|
@ -1417,7 +1417,7 @@ class AutodetectorTests(TestCase):
|
||||||
changes = self.get_changes([self.author_name], [self.author_name_check_constraint])
|
changes = self.get_changes([self.author_name], [self.author_name_check_constraint])
|
||||||
self.assertNumberMigrations(changes, 'testapp', 1)
|
self.assertNumberMigrations(changes, 'testapp', 1)
|
||||||
self.assertOperationTypes(changes, 'testapp', 0, ['AddConstraint'])
|
self.assertOperationTypes(changes, 'testapp', 0, ['AddConstraint'])
|
||||||
added_constraint = models.CheckConstraint(models.Q(name__contains='Bob'), 'name_contains_bob')
|
added_constraint = models.CheckConstraint(check=models.Q(name__contains='Bob'), name='name_contains_bob')
|
||||||
self.assertOperationAttributes(changes, 'testapp', 0, 0, model_name='author', constraint=added_constraint)
|
self.assertOperationAttributes(changes, 'testapp', 0, 0, model_name='author', constraint=added_constraint)
|
||||||
|
|
||||||
def test_remove_constraints(self):
|
def test_remove_constraints(self):
|
||||||
|
|
|
@ -110,7 +110,7 @@ class OperationTestBase(MigrationTestBase):
|
||||||
if check_constraint:
|
if check_constraint:
|
||||||
operations.append(migrations.AddConstraint(
|
operations.append(migrations.AddConstraint(
|
||||||
"Pony",
|
"Pony",
|
||||||
models.CheckConstraint(models.Q(pink__gt=2), name="pony_test_constraint")
|
models.CheckConstraint(check=models.Q(pink__gt=2), name="pony_test_constraint")
|
||||||
))
|
))
|
||||||
if second_model:
|
if second_model:
|
||||||
operations.append(migrations.CreateModel(
|
operations.append(migrations.CreateModel(
|
||||||
|
@ -471,7 +471,7 @@ class OperationTests(OperationTestBase):
|
||||||
@skipUnlessDBFeature('supports_table_check_constraints')
|
@skipUnlessDBFeature('supports_table_check_constraints')
|
||||||
def test_create_model_with_constraint(self):
|
def test_create_model_with_constraint(self):
|
||||||
where = models.Q(pink__gt=2)
|
where = models.Q(pink__gt=2)
|
||||||
check_constraint = models.CheckConstraint(where, name='test_constraint_pony_pink_gt_2')
|
check_constraint = models.CheckConstraint(check=where, name='test_constraint_pony_pink_gt_2')
|
||||||
operation = migrations.CreateModel(
|
operation = migrations.CreateModel(
|
||||||
"Pony",
|
"Pony",
|
||||||
[
|
[
|
||||||
|
@ -1782,7 +1782,7 @@ class OperationTests(OperationTestBase):
|
||||||
project_state = self.set_up_test_model('test_addconstraint')
|
project_state = self.set_up_test_model('test_addconstraint')
|
||||||
|
|
||||||
where = models.Q(pink__gt=2)
|
where = models.Q(pink__gt=2)
|
||||||
check_constraint = models.CheckConstraint(where, name='test_constraint_pony_pink_gt_2')
|
check_constraint = models.CheckConstraint(check=where, name='test_constraint_pony_pink_gt_2')
|
||||||
operation = migrations.AddConstraint('Pony', check_constraint)
|
operation = migrations.AddConstraint('Pony', check_constraint)
|
||||||
self.assertEqual(operation.describe(), 'Create constraint test_constraint_pony_pink_gt_2 on model Pony')
|
self.assertEqual(operation.describe(), 'Create constraint test_constraint_pony_pink_gt_2 on model Pony')
|
||||||
|
|
||||||
|
|
|
@ -1143,7 +1143,7 @@ class ModelStateTests(SimpleTestCase):
|
||||||
size = models.IntegerField()
|
size = models.IntegerField()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
constraints = [models.CheckConstraint(models.Q(size__gt=1), 'size_gt_1')]
|
constraints = [models.CheckConstraint(check=models.Q(size__gt=1), name='size_gt_1')]
|
||||||
|
|
||||||
state = ModelState.from_model(ModelWithConstraints)
|
state = ModelState.from_model(ModelWithConstraints)
|
||||||
model_constraints = ModelWithConstraints._meta.constraints
|
model_constraints = ModelWithConstraints._meta.constraints
|
||||||
|
|
Loading…
Reference in New Issue