iT邦幫忙

2023 iThome 鐵人賽

DAY 14
0
自我挑戰組

Django 初學入門 - 從 ROR 的角度來學習 Django系列 第 14

DAY14 - 第二個 Model 建立 - Store

  • 分享至 

  • xImage
  •  

由於我們要做的是簡易線上商城,總共會有三個 Model,一個 Employer(老闆)、Store(商店)、Product(產品),目前才剛完成 Employer,所以現在要來完成第二個 Model ~

商店 Store 欄位規劃

  1. title : 商店名稱,用字串顯示
  2. description : 商店的描述,用一段字顯示
  3. employer_id : 商店的老闆是誰,一個老闆可以開很多間分店,因此 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/

model 建立

因為 一對多 的關係,一個老闆可以開很多家商店,所以要多加一段 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

ForeignKey

這一段裡面比較特殊的是 employer = models.ForeignKey(Employer, on_delete=models.SET_NULL, null=True),他是在設定 StoreEmployer 的關聯,如果今天是一對多,就使用 .ForeignKey,後面的參數:

  1. Employer 就是指對應到的 Model
  2. on_delete=models.SET_NULL 則是說,如果今天刪掉老闆的資料,商店不會被刪掉,此欄位會變成 Null 值
  3. null=True 是指這個欄位可以是 null 值

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 的變化歷程

總結

今天學到哪些東西呢?

  1. 第二個 Model 建立
  2. 一對多的關聯怎麼設定
  3. migration 檔案再次介紹

最後附上 Github: https://github.com/eagle0526/Django-store


上一篇
DAY13 - Employer CRUD 中的 Delete
下一篇
DAY15 - Store CRUD 的 LIST 和 CREATE
系列文
Django 初學入門 - 從 ROR 的角度來學習 Django30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言