iT邦幫忙

2023 iThome 鐵人賽

DAY 18
0
自我挑戰組

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

DAY18 - 第三個 Model 建立 - Product

  • 分享至 

  • xImage
  •  

我們前面已經完成兩個 Model 了,現在要做完第三個 Model,也就是 Product 產品,這個 Model 跟前面有什麼關聯呢?

每一間商店可以賣出很多產品,並且每個產品可以在很多間商店出現,也就是多對多的關係!
ex. 商店 A 有賣產品 A、B、C,商店 B 也有賣產品 A、B

商店 Store 欄位規劃

  1. title : 產品名稱,用字串顯示
  2. price : 產品價錢,用小數點顯示
Product type Foreign Key
title String
price Float

StoreProduct 表格

這個表是因為多對多的關係產生的表,這個表會有下面兩個欄位:

  1. store_id : 紀錄對應的商店 ID
  2. product_id: 紀錄對應的產品 ID
StoreProduct type Foreign Key
store_id Integer Store
product_id Integer Product

Ps. 這邊就不再對介紹為什麼會有第三張表了,這邊提供一個連結 - 多對多關聯介紹,非常清楚了說明多對多關聯的由來

連結

先來整理一下等等會用到的一些頁面

<!-- 產品列表頁 -->
http://127.0.0.1:8000/online/prodcts

<!-- 產品新增頁 -->
http://127.0.0.1:8000/online/product/create/

<!-- 產品資訊頁 -->
http://127.0.0.1:8000/online/product/3

<!-- 產品更新頁 -->
http://127.0.0.1:8000/online/product/3/update/

<!-- 產品刪除頁 -->
http://127.0.0.1:8000/online/product/3/delete/

model 建立

  1. 因為 多對多 的關係,一個商店可以販賣很多產品,一個產品也可以在很多商店被賣,所以要多加一段 store 的 ForeignKey
  2. 今天欄位是小數點的話,記得使用 DecimalField
# online/models.py

class Product(models.Model):
    title = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    store = models.ManyToManyField(Store)

    def get_absolute_url(self):
        return reverse('product-detail', args=[str(self.id)])

    def __str__(self):
        return self.title

ManyToManyField

這一段裡面比較特殊的是 store = models.ManyToManyField(Store),他是在設定今天 Product 跟 Store 的關聯,如果今天是兩個表是 多對多,就把要設關聯的物件放到 ManyToManyField 裡面:


ROR 的多對多關聯設定,也是在產生 migration 的時候設定好,所以跟 Django 的差異不大


具現化表單

每當修改 Model 欄位的資料,就要記得這兩個指令喔!首先看一下我們的 model 改變:

$ python3 manage.py makemigrations

------
Migrations for 'online':
  online/migrations/0003_product.py
    - Create model Product

再來執行 migrate

$ python3 manage.py migrate 

------
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, online, sessions
Running migrations:
  Applying online.0003_product... OK

還記得嗎?執行完 model 具現化的指令後!你的 migration 資料夾裡面應該會多一個檔案,我們把它打開來看看:

# store/online/migrations/0002_product.py

# Generated by Django 4.2.4 on 2023-09-07 11:12

from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ('online', '0002_store'),
    ]

    operations = [
        migrations.CreateModel(
            name='Product',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('title', models.CharField(max_length=100)),
                ('price', models.DecimalField(decimal_places=2, max_digits=10)),
                ('store', models.ManyToManyField(to='online.store')),
            ],
        ),
    ]

裡面有這些檔案,主要就是在說你剛剛新增的 Model,還有這一個檔案跟 0001_initial 檔案的關聯,這樣以後看 migration 檔案就可以了解 Model 的變化歷程

總結

今天學到哪些東西呢?

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

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


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

尚未有邦友留言

立即登入留言