1
0
mirror of https://github.com/django/django.git synced 2025-10-27 15:46:10 +00:00

[4.2.x] Fixed #34840 -- Avoided casting string base fields on PostgreSQL.

Thanks Alex Vandiver for the report.

Regression in 09ffc5c121.

Backport of 779cd28acb from main.
This commit is contained in:
Mariusz Felisiak
2023-09-22 06:01:11 +02:00
parent b08f53ff46
commit a148461f1f
6 changed files with 78 additions and 15 deletions

View File

@@ -779,6 +779,42 @@ class UniqueConstraintTests(TestCase):
exclude={"name"},
)
def test_validate_nullable_textfield_with_isnull_true(self):
is_null_constraint = models.UniqueConstraint(
"price",
"discounted_price",
condition=models.Q(unit__isnull=True),
name="uniq_prices_no_unit",
)
is_not_null_constraint = models.UniqueConstraint(
"price",
"discounted_price",
condition=models.Q(unit__isnull=False),
name="uniq_prices_unit",
)
Product.objects.create(price=2, discounted_price=1)
Product.objects.create(price=4, discounted_price=3, unit="ng/mL")
msg = "Constraint “uniq_prices_no_unit” is violated."
with self.assertRaisesMessage(ValidationError, msg):
is_null_constraint.validate(
Product, Product(price=2, discounted_price=1, unit=None)
)
is_null_constraint.validate(
Product, Product(price=2, discounted_price=1, unit="ng/mL")
)
is_null_constraint.validate(Product, Product(price=4, discounted_price=3))
msg = "Constraint “uniq_prices_unit” is violated."
with self.assertRaisesMessage(ValidationError, msg):
is_not_null_constraint.validate(
Product,
Product(price=4, discounted_price=3, unit="μg/mL"),
)
is_not_null_constraint.validate(Product, Product(price=4, discounted_price=3))
is_not_null_constraint.validate(Product, Product(price=2, discounted_price=1))
def test_name(self):
constraints = get_constraints(UniqueConstraintProduct._meta.db_table)
expected_name = "name_color_uniq"