マイグレーションファイルにmigrations.RunPython
で処理を書くと実行されます
例(テーブルを作成した後にマスタデータを入れる)
# Generated by Django 3.2.18 on 2023-05-22 02:24
from django.db import migrations, models
import django.db.models.deletion
def insert_member_status(apps, schema_editor):
from api.models.member_status import MemberStatus
MemberStatus(name='仮会員').save()
MemberStatus(name='本会員').save()
MemberStatus(name='退会').save()
MemberStatus(name='メルマガ会員').save()
class Migration(migrations.Migration):
dependencies = [
('api', '0152_auto_20230517_1058'),
]
operations = [
migrations.CreateModel(
name='MemberStatus',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255)),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created')),
('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated')),
('deleted_at', models.DateTimeField(blank=True, null=True, verbose_name='deleted')),
],
options={
'abstract': False,
},
),
# マスタデータを入れる
migrations.RunPython(insert_member_status),
]
直接クエリで書くこともできます
from django.db import connection
def insert_member_status(apps, schema_editor):
with connection.cursor() as cursor:
sql = """
INSERT INTO `api_member_status` (`name`, `created_at`, `updated_at`, `deleted_at`)
VALUES
('仮会員', '2023-06-02 00:00:00.000000', '2023-06-02 00:00:00.000000', NULL),
('本会員', '2023-06-02 00:00:00.000000', '2023-06-02 00:00:00.000000', NULL),
('退会', '2023-06-02 00:00:00.000000', '2023-06-02 00:00:00.000000', NULL),
('メルマガ会員', '2023-06-02 00:00:00.000000', '2023-06-02 00:00:00.000000', NULL);
"""
cursor.execute(sql)
cursor.fetchone()
sql = """
UPDATE api_csvtypes SET is_update_only = 1, skip_function = "sales_plan_skip" WHERE id = 14;
"""
cursor.execute(sql)
cursor.fetchone()
あとDjangoのマイグレーションで作られないALTER文流したりとかもできると思います