diff --git a/django/db/migrations/operations/fields.py b/django/db/migrations/operations/fields.py index 732cccd12c..72b54382ef 100644 --- a/django/db/migrations/operations/fields.py +++ b/django/db/migrations/operations/fields.py @@ -1,5 +1,5 @@ from django.db.migrations.utils import field_references -from django.db.models import NOT_PROVIDED +from django.db.models import NOT_PROVIDED, Model from django.utils.copy import replace from django.utils.functional import cached_property @@ -49,12 +49,19 @@ class FieldOperation(Operation): if model_name_lower == self.model_name_lower: if name == self.name: return True - elif ( - self.field - and hasattr(self.field, "from_fields") - and name in self.field.from_fields - ): - return True + if self.field: + if ( + hasattr(self.field, "from_fields") + and name in self.field.from_fields + ): + return True + elif self.field.generated and any( + field_name == name + for field_name, *_ in Model._get_expr_references( + self.field.expression + ) + ): + return True # Check if this operation remotely references the field. if self.field is None: return False diff --git a/tests/migrations/test_operations.py b/tests/migrations/test_operations.py index a893442ce6..0bf16cb481 100644 --- a/tests/migrations/test_operations.py +++ b/tests/migrations/test_operations.py @@ -6842,6 +6842,21 @@ class FieldOperationTests(SimpleTestCase): operation.references_field("Through", "second", "migrations"), True ) + def test_references_field_by_generated_field(self): + operation = FieldOperation( + "Model", + "field", + models.GeneratedField( + expression=F("foo") + F("bar"), + output_field=models.IntegerField(), + db_persist=True, + ), + ) + self.assertIs(operation.references_field("Model", "foo", "migrations"), True) + self.assertIs(operation.references_field("Model", "bar", "migrations"), True) + self.assertIs(operation.references_field("Model", "alien", "migrations"), False) + self.assertIs(operation.references_field("Other", "foo", "migrations"), False) + class BaseOperationTests(SimpleTestCase): def test_formatted_description_no_category(self):