[Django3.0]migrationしてテーブル作成する手順

Djangoでmigrationを実行するには、
1.Models.pyにテーブル名とカラムを記載
2.migrationファイルの作成
3.マイグレーションで実行されるSQL確認
4.マイグレーションの実行

その為、まずUIを元にデータ型を整理します。

UI

データ型

データ型を元にmodels.pyを書いていきます。
/sales/models.py

from django.db import models

class Master(models.Model):
	name = models.CharField(max_length=255)
	office = models.CharField(max_length=255, null=True)
	zipcode = models.CharField(max_length=8)
	prefecture = models.CharField(max_length=20)
	address = models.CharField(max_length=255)
	tel = models.CharField(max_length=15)
	fax = models.CharField(max_length=15, null=True)
	mail = models.EmailField(max_length=255)
	name_top = models.CharField(max_length=255)
	position_top = models.CharField(max_length=100, null=True)
	created_at = models.DateTimeField(auto_now_add=True)
	updated_at = models.DateTimeField(auto_now=True)

	def __str__(self):
		return self.name

– max_lengthは基本はvarchar(255)とします
– 郵便番号、TEL、FAXはハイフンなしであればIntegerですが、ハイフンありで入力する場合もあるのでCharFieldにしておきます
– null可のカラムは null=Trueと書いておきます
– __str__の使い方がよくわからないので、とりあえずreturn self.nameとしておきます。

$ python manage.py makemigrations sales

/sales/migrations/0001_initial.py

from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='Master',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=255)),
                ('office', models.CharField(max_length=255, null=True)),
                ('zipcode', models.CharField(max_length=8)),
                ('prefecture', models.CharField(max_length=20)),
                ('address', models.CharField(max_length=255)),
                ('tel', models.CharField(max_length=15)),
                ('fax', models.CharField(max_length=15, null=True)),
                ('mail', models.EmailField(max_length=255)),
                ('name_top', models.CharField(max_length=255)),
                ('position_top', models.CharField(max_length=100, null=True)),
                ('created_at', models.DateField(auto_now_add=True)),
                ('updated_at', models.DateField(auto_now=True)),
            ],
        ),
    ]

$ python manage.py migrate
mysql> show tables;
+—————————-+
| Tables_in_hanbai |
+—————————-+
| auth_group |
| auth_group_permissions |
| auth_permission |
| auth_user |
| auth_user_groups |
| auth_user_user_permissions |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
| sales_master |
+—————————-+
11 rows in set (0.00 sec)

mysql> describe sales_master;
+————–+————–+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+————–+————–+——+—–+———+—————-+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
| office | varchar(255) | YES | | NULL | |
| zipcode | varchar(8) | NO | | NULL | |
| prefecture | varchar(20) | NO | | NULL | |
| address | varchar(255) | NO | | NULL | |
| tel | varchar(15) | NO | | NULL | |
| fax | varchar(15) | YES | | NULL | |
| mail | varchar(255) | NO | | NULL | |
| name_top | varchar(255) | NO | | NULL | |
| position_top | varchar(100) | YES | | NULL | |
| created_at | datetime(6) | NO | | NULL | |
| updated_at | datetime(6) | NO | | NULL | |
+————–+————–+——+—–+———+—————-+
13 rows in set (0.00 sec)

tableの作成方法まできました。
table nameはアプリケーション名が先頭に付くので、sales_masterになっていることがわかります。ER図のtable名も直しておきます。
続いて、手動でデータをinsertして、表示するところまで行きたい。