mirror of
https://github.com/django/django.git
synced 2025-08-31 07:47:37 +00:00
Fixed #29641 -- Added support for unique constraints in Meta.constraints.
This constraint is similar to Meta.unique_together but also allows specifying a name. Co-authored-by: Ian Foote <python@ian.feete.org>
This commit is contained in:
parent
8eae094638
commit
db13bca60a
7 changed files with 126 additions and 5 deletions
|
@ -1,3 +1,4 @@
|
|||
from django.core.exceptions import ValidationError
|
||||
from django.db import IntegrityError, connection, models
|
||||
from django.db.models.constraints import BaseConstraint
|
||||
from django.test import SimpleTestCase, TestCase, skipUnlessDBFeature
|
||||
|
@ -50,3 +51,42 @@ class CheckConstraintTests(TestCase):
|
|||
if connection.features.uppercases_column_names:
|
||||
expected_name = expected_name.upper()
|
||||
self.assertIn(expected_name, constraints)
|
||||
|
||||
|
||||
class UniqueConstraintTests(TestCase):
|
||||
@classmethod
|
||||
def setUpTestData(cls):
|
||||
cls.p1 = Product.objects.create(name='p1')
|
||||
|
||||
def test_repr(self):
|
||||
fields = ['foo', 'bar']
|
||||
name = 'unique_fields'
|
||||
constraint = models.UniqueConstraint(fields=fields, name=name)
|
||||
self.assertEqual(
|
||||
repr(constraint),
|
||||
"<UniqueConstraint: fields=('foo', 'bar') name='unique_fields'>",
|
||||
)
|
||||
|
||||
def test_deconstruction(self):
|
||||
fields = ['foo', 'bar']
|
||||
name = 'unique_fields'
|
||||
check = models.UniqueConstraint(fields=fields, name=name)
|
||||
path, args, kwargs = check.deconstruct()
|
||||
self.assertEqual(path, 'django.db.models.UniqueConstraint')
|
||||
self.assertEqual(args, ())
|
||||
self.assertEqual(kwargs, {'fields': tuple(fields), 'name': name})
|
||||
|
||||
def test_database_constraint(self):
|
||||
with self.assertRaises(IntegrityError):
|
||||
Product.objects.create(name=self.p1.name)
|
||||
|
||||
def test_model_validation(self):
|
||||
with self.assertRaisesMessage(ValidationError, 'Product with this Name already exists.'):
|
||||
Product(name=self.p1.name).validate_unique()
|
||||
|
||||
def test_name(self):
|
||||
constraints = get_constraints(Product._meta.db_table)
|
||||
expected_name = 'unique_name'
|
||||
if connection.features.uppercases_column_names:
|
||||
expected_name = expected_name.upper()
|
||||
self.assertIn(expected_name, constraints)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue