mirror of
https://github.com/django/django.git
synced 2025-10-24 06:06:09 +00:00
Fixed #35359 -- Fixed migration operations ordering when adding fields referenced by GeneratedField.expression.
Thank you to Simon Charette for the review.
This commit is contained in:
@@ -9,7 +9,7 @@ from django.db.migrations.operations.fields import FieldOperation
|
||||
from django.db.migrations.state import ModelState, ProjectState
|
||||
from django.db.models import F
|
||||
from django.db.models.expressions import Value
|
||||
from django.db.models.functions import Abs, Pi
|
||||
from django.db.models.functions import Abs, Concat, Pi
|
||||
from django.db.transaction import atomic
|
||||
from django.test import (
|
||||
SimpleTestCase,
|
||||
@@ -1379,6 +1379,54 @@ class OperationTests(OperationTestBase):
|
||||
self.assertEqual(definition[1], [])
|
||||
self.assertEqual(sorted(definition[2]), ["field", "model_name", "name"])
|
||||
|
||||
@skipUnlessDBFeature("supports_stored_generated_columns")
|
||||
def test_add_generate_field(self):
|
||||
app_label = "test_add_generate_field"
|
||||
project_state = self.apply_operations(
|
||||
app_label,
|
||||
ProjectState(),
|
||||
operations=[
|
||||
migrations.CreateModel(
|
||||
"Rider",
|
||||
fields=[
|
||||
("id", models.AutoField(primary_key=True)),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
"Pony",
|
||||
fields=[
|
||||
("id", models.AutoField(primary_key=True)),
|
||||
("name", models.CharField(max_length=20)),
|
||||
(
|
||||
"rider",
|
||||
models.ForeignKey(
|
||||
f"{app_label}.Rider", on_delete=models.CASCADE
|
||||
),
|
||||
),
|
||||
(
|
||||
"name_and_id",
|
||||
models.GeneratedField(
|
||||
expression=Concat(("name"), ("rider_id")),
|
||||
output_field=models.TextField(),
|
||||
db_persist=True,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
)
|
||||
Pony = project_state.apps.get_model(app_label, "Pony")
|
||||
Rider = project_state.apps.get_model(app_label, "Rider")
|
||||
rider = Rider.objects.create()
|
||||
pony = Pony.objects.create(name="pony", rider=rider)
|
||||
self.assertEqual(pony.name_and_id, str(pony.name) + str(rider.id))
|
||||
|
||||
new_rider = Rider.objects.create()
|
||||
pony.rider = new_rider
|
||||
pony.save()
|
||||
pony.refresh_from_db()
|
||||
self.assertEqual(pony.name_and_id, str(pony.name) + str(new_rider.id))
|
||||
|
||||
def test_add_charfield(self):
|
||||
"""
|
||||
Tests the AddField operation on TextField.
|
||||
|
||||
Reference in New Issue
Block a user