Django 透過名為 模型(Model)的 Python 物件來管理與訪問資料。模型用來定義儲存的資料結構,包含欄位與行為,在進行資料遷移時會根據模型欄位生成對應的資料表與欄位。
而模型的定義與底層介接哪種資料庫無關,我們只需要定義好模型,Django 會與資料庫溝通,繁瑣的事情都幫我們處理好了。
今天的內容可能會稍微枯燥一點,但不需要死記硬背,只需要先認識它,日後有需求的時候知道有這個欄位與參數,再回來查詢使用就可以了,接著就先來看看如何定義欄位吧!
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'),
]
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)
ForeignKey
為多對一關聯欄位,需要指定關聯的模型與 on_delete 選項。
related_name 參數為從關聯物件到當前物件的關聯名稱
on_delete 參數為關聯物件刪除時的 SQL 行為,常用的參數有以下三種:
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)
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 模型』