10000 [4.1.x] Fixed #34319 -- Fixed Model.validate_constraints() crash on V… · django/django@590a92e · GitHub
[go: up one dir, main page]

Skip to content

Commit 590a92e

Browse files
committed
[4.1.x] Fixed #34319 -- Fixed Model.validate_constraints() crash on ValidationError with no code.
Thanks Mateusz Kurowski for the report. Regression in 6671058. Backport of 2fd755b from main
1 parent ae53649 commit 590a92e

File tree

3 files changed

+27
-3
lines changed

3 files changed

+27
-3
lines changed

django/db/models/base.py

Lines changed: 4 additions & 1 deletion
< 10000 td data-grid-cell-id="diff-1c8b882c73bfda668d5451d4578c97191b0ebc0f088d0c0ba2296ab89b428c44-1428-1431-2" data-line-anchor="diff-1c8b882c73bfda668d5451d4578c97191b0ebc0f088d0c0ba2296ab89b428c44R1431" data-selected="false" role="gridcell" style="background-color:var(--bgColor-default);padding-right:24px" tabindex="-1" valign="top" class="focusable-grid-cell diff-text-cell right-side-diff-cell left-side">
errors = e.update_error_dict(errors)
Original file line numberDiff line numberDiff line change
@@ -1422,7 +1422,10 @@ def validate_constraints(self, exclude=None):
14221422
try:
14231423
constraint.validate(model_class, self, exclude=exclude, using=using)
14241424
except ValidationError as e:
1425-
if e.code == "unique" and len(constraint.fields) == 1:
1425+
if (
1426+
getattr(e, "code", None) == "unique"
1427+
and len(constraint.fields) == 1
1428+
):
14261429
errors.setdefault(constraint.fields[0], []).append(e)
14271430
else:
14281431

docs/releases/4.1.7.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@ in 4.1.6.
1212
Bugfixes
1313
========
1414

15-
* ...
15+
* Fixed a bug in Django 4.1 that caused a crash of model validation on
16+
``ValidationError`` with no ``code`` (:ticket:`34319`).

tests/constraints/tests.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from django.core.exceptions import ValidationError
44
from django.db import IntegrityError, connection, models
55
from django.db.models import F
6-
from django.db.models.constraints import BaseConstraint
6+
from django.db.models.constraints import BaseConstraint, UniqueConstraint
77
from django.db.models.functions import Lower
88
from django.db.transaction import atomic
99
from django.test import SimpleTestCase, TestCase, skipIfDBFeature, skipUnlessDBFeature
@@ -589,6 +589,26 @@ def test_model_validation_with_condition(self):
589589
with self.assertRaisesMessage(ValidationError, msg):
590590
UniqueConstraintConditionProduct(name=obj2.name).validate_constraints()
591591

592+
def test_model_validation_constraint_no_code_error(self):
593+
class ValidateNoCodeErrorConstraint(UniqueConstraint):
594+
def validate(self, model, instance, **kwargs):
595+
raise ValidationError({"name": ValidationError("Already exists.")})
596+
597+
class NoCodeErrorConstraintModel(models.Model):
598+
name = models.CharField(max_length=255)
599+
600+
class Meta:
601+
constraints = [
602+
ValidateNoCodeErrorConstraint(
603+
Lower("name"),
604+
name="custom_validate_no_code_error",
605+
)
606+
]
607+
608+
msg = "{'name': ['Already exists.']}"
609+
with self.assertRaisesMessage(ValidationError, msg):
610+
NoCodeErrorConstraintModel(name="test").validate_constraints()
611+
592612
def test_validate(self):
593613
constraint = UniqueConstraintProduct._meta.constraints[0]
594614
msg = "Unique constraint product with this Name and Color already exists."

0 commit comments

Comments
 (0)
0