Makemigration - Создание модели и вставка данных только один раз

У меня есть модель, как показано ниже:

from django.db import models

class Country(models.Model):
    cid = models.SmallAutoField(primary_key=True)
    label = models.CharField(max_length=100)
    abbr = models.CharField(max_length=3)

countries = {
"AFG": "Afghanistan",
"ALB": "Albania",
"DZA": "Algeria",
"ASM": "American Samoa",
"AND": "Andorra",
"AGO": "Angola",
"AIA": "Anguilla"
};


for c in countries:
    row = Country(label = countries[c], abbr = c)
    row.save()

Теперь каждый раз, когда я выполняю следующую команду:

python manage.py makemigrations

В первый раз он создает таблицу и заполняет ее. Второй, третий и так далее раз, он продолжает вставлять одни и те же данные (определенно возможно, что я буду использовать команду makemigration много раз, поэтому я не хочу, чтобы она вставляла их каждый раз, когда выполняется команда)

Есть ли способ достичь этого? Создать и вставить один раз?

Вы можете добавить миграции данных , которые создают данные, они запускаются один раз, когда применяется миграция. Это пример, когда миграция данных добавляется к миграции, которая также добавляет модель

from django.db import migrations, models

countries = {
    "AFG": "Afghanistan",
    "ALB": "Albania",
    "DZA": "Algeria",
    "ASM": "American Samoa",
    "AND": "Andorra",
    "AGO": "Angola",
    "AIA": "Anguilla"
}


def create_countries(apps, schema_editor):
    Country = apps.get_model('myapp', 'Country')
    for c in countries:
        Country.objects.create(label=countries[c], abbr=c)


class Migration(migrations.Migration):

    dependencies = [
        ('myapp', '0000_previous'),
    ]

    operations = [
        migrations.CreateModel(
            name='Country',
            fields=[
                ('cid', models.SmallAutoField(primary_key=True, serialize=False)),
                ('label', models.CharField(max_length=100)),
                ('abbr', models.CharField(max_length=3)),
            ],
        ),
        migrations.RunPython(create_countries),
    ]
Вернуться на верх