В миграции Django, как я могу создать объект и использовать его по умолчанию в другом поле? - PullRequest
0 голосов
/ 11 апреля 2020

У меня уже есть модель Area. Я хочу добавить новую модель City, например:

class City(models.Model):
    pass

class Area(models.Model):
    city = models.ForeignKey(City, on_delete=models.PROTECT) # new field.

Как создать миграцию, которая устанавливает существующие районы в город (называемый «Мумбаи»)?

Я знаю Я могу сделать migrations.RunPython, но как мне получить идентификатор нового города для передачи models.ForeignKey default param?

        migrations.AddField(
            model_name='area',
            name='city',
            field=models.ForeignKey(default=???, to='location.City'),
            preserve_default=False,
        ),

1 Ответ

0 голосов
/ 11 апреля 2020

Я понял, что параметр 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...