1
0
mirror of https://github.com/django/django.git synced 2025-03-10 09:22:46 +00:00

[5.0.x] Fixed #35127 -- Made Model.full_clean() ignore GeneratedFields.

Thanks Claude Paroz for the report.

Regression in f333e3513e8bdf5ffeb6eeb63021c230082e6f95.
Backport of 4879907223d70ee1a82474d9286ccfa5dae96971 from main
This commit is contained in:
Mariusz Felisiak 2024-01-19 08:55:50 +01:00
parent 4ed1423de4
commit ee78fe390d
4 changed files with 14 additions and 3 deletions

View File

@ -1561,7 +1561,7 @@ class Model(AltersData, metaclass=ModelBase):
errors = {} errors = {}
for f in self._meta.fields: for f in self._meta.fields:
if f.name in exclude: if f.name in exclude or f.generated:
continue continue
# Skip validation for empty fields with blank=True. The developer # Skip validation for empty fields with blank=True. The developer
# is responsible for making sure they have a valid value. # is responsible for making sure they have a valid value.

View File

@ -15,3 +15,6 @@ Bugfixes
* Fixed a regression in Django 5.0 where links in the admin had an incorrect * Fixed a regression in Django 5.0 where links in the admin had an incorrect
color (:ticket:`35121`). color (:ticket:`35121`).
* Fixed a bug in Django 5.0 that caused a crash of ``Model.full_clean()`` on
models with a ``GeneratedField`` (:ticket:`35127`).

View File

@ -502,7 +502,7 @@ class GeneratedModel(models.Model):
output_field=models.IntegerField(), output_field=models.IntegerField(),
db_persist=True, db_persist=True,
) )
fk = models.ForeignKey(Foo, on_delete=models.CASCADE, null=True) fk = models.ForeignKey(Foo, on_delete=models.CASCADE, null=True, blank=True)
class Meta: class Meta:
required_db_features = {"supports_stored_generated_columns"} required_db_features = {"supports_stored_generated_columns"}
@ -516,7 +516,7 @@ class GeneratedModelVirtual(models.Model):
output_field=models.IntegerField(), output_field=models.IntegerField(),
db_persist=False, db_persist=False,
) )
fk = models.ForeignKey(Foo, on_delete=models.CASCADE, null=True) fk = models.ForeignKey(Foo, on_delete=models.CASCADE, null=True, blank=True)
class Meta: class Meta:
required_db_features = {"supports_virtual_generated_columns"} required_db_features = {"supports_virtual_generated_columns"}

View File

@ -168,6 +168,14 @@ class GeneratedFieldTestMixin:
with self.assertRaisesMessage(AttributeError, msg): with self.assertRaisesMessage(AttributeError, msg):
m.field m.field
def test_full_clean(self):
m = self.base_model(a=1, b=2)
# full_clean() ignores GeneratedFields.
m.full_clean()
m.save()
m = self._refresh_if_needed(m)
self.assertEqual(m.field, 3)
def test_create(self): def test_create(self):
m = self.base_model.objects.create(a=1, b=2) m = self.base_model.objects.create(a=1, b=2)
m = self._refresh_if_needed(m) m = self._refresh_if_needed(m)