由於我們要做的是簡易線上商城,總共會有三個 Model,一個 Employer(老闆)、Store(商店)、Product(產品),目前才剛完成 Employer
,所以現在要來完成第二個 Model ~
Employer 和 Store 是 一對多
的關係Store | type | Foreign Key |
---|---|---|
title | String | |
description | text | |
employer_id | Integer | Employer |
先來整理一下等等會用到的一些頁面
<!-- 商店列表頁 -->
http://127.0.0.1:8000/online/stores
<!-- 商店新增頁 -->
http://127.0.0.1:8000/online/store/create/
<!-- 商店資訊頁 -->
http://127.0.0.1:8000/online/store/3
<!-- 商店更新頁 -->
http://127.0.0.1:8000/online/store/3/update/
<!-- 商店刪除頁 -->
http://127.0.0.1:8000/online/store/3/delete/
因為 一對多
的關係,一個老闆可以開很多家商店,所以要多加一段 employer
的 ForeignKey
# online/models.py
class Store(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
employer = models.ForeignKey(Employer, on_delete=models.SET_NULL, null=True)
def get_absolute_url(self):
return reverse('store-detail', args=[str(self.id)])
def __str__(self):
return self.title
這一段裡面比較特殊的是 employer = models.ForeignKey(Employer, on_delete=models.SET_NULL, null=True)
,他是在設定 Store
跟 Employer
的關聯,如果今天是一對多,就使用 .ForeignKey
,後面的參數:
Ps. 如果今天想要刪掉老闆的時候,順便刪掉老闆底下的所有商店,把關聯改成這樣就可以 employer = models.ForeignKey(Employer, on_delete=models.CASCADE)
ROR 的關聯設定,也是在產生 migration 的時候設定好,所以跟 Django 的差異不大,不過 Djdngo 是直接在 model 檔案的地方設定
每當修改 Model 欄位的資料,就要記得這兩個指令喔!首先看一下我們的 model 改變:
$ python3 manage.py makemigrations
------
Migrations for 'online':
online/migrations/0002_store.py
- Create model Store
再來執行 migrate
:
$ python3 manage.py migrate
------
Operations to perform:
Apply all migrations: admin, auth, contenttypes, online, sessions
Running migrations:
Applying online.0002_store... OK
還記得嗎?執行完 model 具現化的指令後!你的 migration
資料夾裡面應該會多一個檔案,我們把它打開來看看:
# store/online/migrations/0002_store.py
# Generated by Django 4.2.4 on 2023-09-06 04:59
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('online', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='Store',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=100)),
('description', models.TextField()),
('employer', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='online.employer')),
],
),
]
裡面有這些檔案,主要就是在說你剛剛新增的 Model,還有這一個檔案跟 0001_initial
檔案的關聯,這樣以後看 migration
檔案就可以了解 Model
的變化歷程
今天學到哪些東西呢?
最後附上 Github: https://github.com/eagle0526/Django-store