From b287af5dc954628d4b336aefc5027b2edceee64b Mon Sep 17 00:00:00 2001 From: Sarah Boyce <42296566+sarahboyce@users.noreply.github.com> Date: Wed, 6 Dec 2023 23:19:09 +0100 Subject: Fixed #35019 -- Fixed save() on models with both GeneratedFields and ForeignKeys. Thanks Deb Kumar Das for the report. Regression in f333e3513e8bdf5ffeb6eeb63021c230082e6f95. --- tests/model_fields/models.py | 2 ++ tests/model_fields/test_generatedfield.py | 15 +++++++++++++++ 2 files changed, 17 insertions(+) (limited to 'tests') diff --git a/tests/model_fields/models.py b/tests/model_fields/models.py index aea02964e2..69b4e26145 100644 --- a/tests/model_fields/models.py +++ b/tests/model_fields/models.py @@ -502,6 +502,7 @@ class GeneratedModel(models.Model): output_field=models.IntegerField(), db_persist=True, ) + fk = models.ForeignKey(Foo, on_delete=models.CASCADE, null=True) class Meta: required_db_features = {"supports_stored_generated_columns"} @@ -515,6 +516,7 @@ class GeneratedModelVirtual(models.Model): output_field=models.IntegerField(), db_persist=False, ) + fk = models.ForeignKey(Foo, on_delete=models.CASCADE, null=True) class Meta: required_db_features = {"supports_virtual_generated_columns"} diff --git a/tests/model_fields/test_generatedfield.py b/tests/model_fields/test_generatedfield.py index 056a80c294..589f78cbb0 100644 --- a/tests/model_fields/test_generatedfield.py +++ b/tests/model_fields/test_generatedfield.py @@ -1,4 +1,5 @@ import uuid +from decimal import Decimal from django.apps import apps from django.db import IntegrityError, connection @@ -15,6 +16,7 @@ from django.test import SimpleTestCase, TestCase, skipUnlessDBFeature from django.test.utils import isolate_apps from .models import ( + Foo, GeneratedModel, GeneratedModelFieldWithConverters, GeneratedModelNull, @@ -187,6 +189,19 @@ class GeneratedFieldTestMixin: m.refresh_from_db() self.assertEqual(m.field, 8) + def test_save_model_with_foreign_key(self): + fk_object = Foo.objects.create(a="abc", d=Decimal("12.34")) + m = self.base_model(a=1, b=2, fk=fk_object) + m.save() + m = self._refresh_if_needed(m) + self.assertEqual(m.field, 3) + + def test_generated_fields_can_be_deferred(self): + fk_object = Foo.objects.create(a="abc", d=Decimal("12.34")) + m = self.base_model.objects.create(a=1, b=2, fk=fk_object) + m = self.base_model.objects.defer("field").get(id=m.id) + self.assertEqual(m.get_deferred_fields(), {"field"}) + def test_update(self): m = self.base_model.objects.create(a=1, b=2) self.base_model.objects.update(b=3) -- cgit v1.3