顧客が多数の見積を取る事を考え、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が出来てるううううううううううううううううううう