Я понял, что параметр models.ForeignKey(default=???)
может вызываться, поэтому я создал город в RunPython
и использовал его для получения id
.
Полный код:
class CityObjectHolder:
@classmethod
def get_object_id(cls):
return cls.city_object.id
@classmethod
def create(cls, apps, schema_editor):
# We get the model from the versioned app registry;
# if we directly import it, it'll be the wrong version
City = apps.get_model('location', 'City')
db_alias = schema_editor.connection.alias
cls.city_object = City.objects.create(name='Mumbai')
print(f'created city with id: {cls.city_object.id}')
class Migration(migrations.Migration):
dependencies = [
('location', '0011_auto_20200403_2212'),
]
operations = [
migrations.CreateModel(
name='City',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.TextField(unique=True)),
('json_data', django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
],
),
migrations.RunPython(CityObjectHolder.create),
migrations.AddField(
model_name='area',
name='city',
field=models.ForeignKey(default=CityObjectHolder.get_object_id, on_delete=django.db.models.deletion.PROTECT, to='location.City'),
preserve_default=False,
),
]
RunPython
ref: https://docs.djangoproject.com/en/2.2/ref/migration-operations/#runpython
Использование чего-либо кроме вызываемого для models.ForeignKey(default=???)
не работало, потому что этот код выполнялся до выполнения CityObjectHolder.create
.