[Django3.0] 1対多(hasMany)のモデルを作成

顧客が多数の見積を取る事を考え、sales_clientsテーブルから1対多(hasMany)の関係にあるテーブルを作成したい。

見積登録画面

見積画面を元にテーブルのデータ型を作成していきます。
mysqlのdateはDateField、integerはIntegerFieldにします。
clientはhasManyのFoerignKeyとなるものです。

データ型が一通り出来たら、ER図を修正します。

さて、いよいよデータ型を元にmodels.pyを作っていきます。
リレーションは、models.ForeignKey(${modelName})で書きます。
顧客レコードが削除されたら、顧客レコードに紐づいた見積も一緒に削除されると困るので、on_delete=models.PROTECTと設定してあげます。

models.py

class Estimates(models.Model):
	client = models.ForeignKey(Clients, on_delete=models.PROTECT)
	estimate_date = models.DateField(auto_now=True)
	position = models.CharField(max_length=50, null=True, blank=True)
	name = models.CharField(max_length=255, null=True, blank=True)
	title = models.CharField(max_length=255)
	classification1 = models.CharField(max_length=255, null=True, blank=True)
	// classification2~classification10は省略
	type1 = models.CharField(max_length=255, null=True, blank=True)
	// type2〜type10は省略
	name1 = models.CharField(max_length=255, null=True, blank=True)
	// name2〜name10は省略
	size1 = models.CharField(max_length=255, null=True, blank=True)
	// size2〜size10は省略
	unit1 = models.IntegerField(null=True, blank=True)
	// unit2〜unit10は省略
	price1 = models.IntegerField(null=True, blank=True)
	// price2〜price10は省略
	total = models.IntegerField(null=True, blank=True)
	remark = models.TextField(max_length=300, null=True, blank=True)
	created_at = models.DateTimeField(auto_now_add=True)
	updated_at = models.DateTimeField(auto_now=True)

	def __str__(self):
		return self.title

### migration
$ python manage.py makemigrations sales
-> 0004_auto_20200913_1714.pyが作成されたので中身を見てみます。fieldsの末尾にmodels.ForeignKeyが作られている事がわかります。

fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('estimate_date', models.DateField(auto_now=True)),
                ('position', models.CharField(blank=True, max_length=50, null=True)),
                // 省略
                ('client', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='sales.Clients')),
            ],

$ python manage.py migrate

mysql> show tables;
mysql> describe sales_estimates;
+——————+————–+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+——————+————–+——+—–+———+—————-+
| id | int(11) | NO | PRI | NULL | auto_increment |
// 省略
| client_id | int(11) | NO | MUL | NULL | |
+——————+————–+——+—–+———+—————-+
70 rows in set (0.00 sec)

ぎゃああああああああああああああああああああああああああああああ
client_idが出来てるううううううううううううううううううう