iT邦幫忙

2022 iThome 鐵人賽

DAY 8
0

Django 透過名為 模型(Model)的 Python 物件來管理與訪問資料。模型用來定義儲存的資料結構,包含欄位與行為,在進行資料遷移時會根據模型欄位生成對應的資料表與欄位。
而模型的定義與底層介接哪種資料庫無關,我們只需要定義好模型,Django 會與資料庫溝通,繁瑣的事情都幫我們處理好了。
今天的內容可能會稍微枯燥一點,但不需要死記硬背,只需要先認識它,日後有需求的時候知道有這個欄位與參數,再回來查詢使用就可以了,接著就先來看看如何定義欄位吧!

Field 常用參數

null

如果為 True,Django 在資料庫儲存的空值為 NULL,預設為 false

blank

如果為 True,該欄位允許為空值,預設為 false

default

該欄位的預設值

max_length

為該欄位最大長度

primary_key

如果為 True,將該欄位設為該模型的主鍵

unique

如果為 True,該欄位必須為唯一值

verbose_name

為人類可讀的名稱,未定義時會自動建立

db_index

如果為 True,為該欄位建立資料庫索引

choices

為一個由元組組成的列表,會在表單上生成一個選擇框而非文字

EXAMPLE_CHOICES = [
    ('A', 'Application'),
    ('B', 'Browser'),
    ('C', 'Confluence'),
    ('D', 'Django'),
    ('E', 'Elasticsearch'),
]

Field 常用欄位

IntegerField

為一個整數,可包含 -2147483648 到 2147483647 的值。

class IntegerField(**options

PositiveIntegerField

為一個正整數或 0,可包含 0 到 2147483647 的值。

class PositiveIntegerField(**options)

AutoField

為一個 IntegerField ,根據可用的 ID 自動遞增。

class AutoField(**options)

BigAutoField

為一個 64 為整數 ,根據可用的 ID 自動遞增,為 1 到 9223372036854775807 的數字。

class BigAutoField(**options

BooleanField

為一個 True / False 欄位,預設的表單為 Checkbox。

class BooleanField(**options)

CharField

為一個字串欄位,必須設定 max_length

class CharField(max_length=None, **options)

DateField

為一個日期,在 Python 中為 datetime.date 實例,可使用 auto_now 參數在模型儲存時寫入當前時間,使用 auto_now_add 在第一次建立時寫入當前日期。

class DateField(auto_now=False, auto_now_add=False, **options)

DateTimeField

為一個日期與時間,在 Python 中為 datetime.datetime 實例,可使用 auto_now 參數在模型儲存時寫入當前日期與時間,使用 auto_now_add 在第一次建立時寫入當前日期與時間。

class DateTimeField(auto_now=False, auto_now_add=False, **options)

FileField

一個檔案上傳欄位,upload_to 參數可以指定上傳目錄和命名檔案的方式

class FileField(upload_to='', storage=None, max_length=100, **options)

FloatField

為一個浮點數欄位

class FloatField(**options)

ImageField

為一個圖片欄位,繼承了 FileField 的所有屬性,並驗證是否上傳的為有效圖片,此外增加了 height 和 width 參數定義圖片的高與寬。

class ImageField(upload_to=None, height_field=None, width_field=None, max_length=100, **options)

JSONField

為一個儲存 json 格式的欄位。

class JSONField(encoder=None, decoder=None, **options)

TextField

為一個大的字串欄位,預設的表單是 Textarea。

class TextField(**options)

Field 關聯欄位

ForeignKey

為多對一關聯欄位,需要指定關聯的模型與 on_delete 選項。

related_name 參數為從關聯物件到當前物件的關聯名稱

on_delete 參數為關聯物件刪除時的 SQL 行為,常用的參數有以下三種:

  1. CASCADE 為連鎖刪除,會連帶 ForeignKey 物件一起刪除,
  2. PROTECT 防止刪除被引用物件。
  3. RESTRICT 防止刪除被引用物件,若如果被引用的對象在同一操作一同被刪除,則允許。
class ForeignKey(to, on_delete, **options)

ManyToManyField

為多對多關聯欄位,需要指定關聯的模型,原理與 ForeignKey 相同。

Django 在背後建立了一個中間表來進行多對多關聯。

through 參數可以指定要使用的中間表。

class ManyToManyField(to, **options)

OneToOneField

為一對一關聯欄位,類似 ForeignKey 與 unique=True,但反向關聯返回一個單一物件。

class OneToOneField(to, on_delete, parent_link=False, **options)

Meta 常用選項

abstarct

如果 abstact = True,該模型將是一個抽象基類,不會建立任何資料表,只用來作為其他模型的基類。

from django.db import models

class ProductBase(models.Model):
    name = models.CharField(max_length=100)
    description= models.PositiveIntegerField()

    class Meta:
        abstract = True

class Product(ProductBase):
    price = models.PositiveIntegerField(default=0)

proxy

如果 proxy = True,該模型將是另一個模型的代理,會共用原模型的資料表,可以用來修改 python 層級的行為。

from django.db import models

class Product(models.Model):
    name= models.CharField(max_length=100)
    description= models.CharField(max_length=100)

class NewProduct(Person):
    class Meta:
        proxy = True

    def do_something(self):
        # ...
        pass

ordering

預設排序,開頭 - 代表降序

ordering = ['-order_date']

verbose_name

為物件的可讀名稱(單數)

verbose_name = "pizza"

verbose_name_plural

verbose_name_plural = "stories"

為物件的可讀名稱(複數)

Django 不只有上面介紹的參數與欄位,但只要熟悉今天介紹的內容完全足以滿足大部分的需求了,明天將直接來進行實作『模型要買櫃,實作 Model 模型』


上一篇
Day7 第一個房客,建立租戶
下一篇
Day9 模型要買櫃,實作 Model 模型
系列文
全能住宅改造王,Django 多租戶架構的應用 —— 實作一個電商網站30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言