介紹ORM
對象關係映射(Object Relational Mapping,簡稱ORM)是通過使用描述對象和數據庫之間映射的元數據,將面嚮對象語言程序中的對象自動持久化到關係數據庫中。
Django中的ORM簡單說就是你調用相應的方法,Django框架會自動幫你轉換成原生SQL進行執行。
經過ORM轉換的SQL語句雖然有一定的性能損壞,不過Django將方法轉換成SQL語句時也會盡力去優化語句,另一方面當今計算機的性能越來越強大的今天,轉換的性能損壞對於大多數服務器來說已經可以忽略不計了。
但ORM模型所帶來的的優勢卻日益突出,特別是代碼的可讀性和代碼維護上。項目越大越能體現出ORM的優越性。
連接MySQL數據庫
使用djangoORM連接MySQL數據庫我們需要安裝mysqlclient
這個模塊,如果你在安裝的時候報錯,提示c++庫未安裝可以嘗試從瀏覽器中下載mysqlclient庫並離線安裝。下載地址
如果安裝失敗,就先升級一下pip(一定要保證pip在最新狀態)可以使用清華源升級pippip install --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple pip
配置文件
下載完mysqlclient我們需要在配置文件(settings.py)中進行配置
在DATABASES中添加信息(這裏大小寫敏感,配置名必須大寫)
DATABASES = {
'default': {
# 註明使用的數據庫爲MySQL
'ENGINE': 'django.db.backends.mysql',
# 使用的數據庫表名
'NAME': 'django的ORM',
# 數據庫登陸用戶名
'USER': 'root',
# 數據庫登陸密碼
'PASSWORD': 'root',
# 數據庫登陸ip
'HOST': 'localhost',
# 數據庫端口
'POST': '3306'
}
}
創建表
每個APP都會自帶一個models. py
文件,這個文件就是APP給你預留用於創建表的文件。下列大致的創建流程。
- 在settings.py中,配置好DATABASES,做好數據庫相關的配置。
- 以類的形式創建一個表,默認表名爲APP名_類名,此類需要繼承(models.Model)。其中進行Field屬性創建不同屬性的表頭,或者創建外鍵等操作
- 生成遷移腳本文件(
python manage.py makemigrations
),遷移腳本文件會將每次數據庫的變化記錄在migrations文件夾中 - 最後將migrations變化的APP的模型映射進入數據庫(
python manage.py migrate
)
可以在命令行啓動映射命令,如果你是用pycharm,這可以使用下列方法
Field屬性介紹
選擇field類型的時候相當於我們在選擇數據的存儲類似
field類型衆多,這麼我們暫時先介紹一些比較常用的類型
field類型 | 作用 |
---|---|
AutoField() |
在數據庫中爲int 類型,映射到數據庫中是int類型的主鍵,默認長度爲11,有自增特性(Django的ORM創建表時如果沒有主鍵會自動生成表頭爲此類型名稱爲id的主鍵)使用此字段必須傳入primary_key=True |
BigAutoField() |
在數據庫中爲bigint 類型,用於長整數類型的主鍵,長度爲20,有自增特性與AutoField不能共存。使用此字段必須傳入primary_key=True ,用作爲主鍵的還有個SmallAutoField() 和此方法類似 |
BooleanField() |
在數據庫中爲tinyint 類型,長度爲1,在模型層面,此類型接收的是True或Flast,當沒有指定默認值時默認爲None |
CharField() |
在數據庫中爲varchar 類型,在模型中爲字符串類型,此類型必須指定長度(max_length ) |
DateTimeField() |
在數據庫中爲datatime 類型,用於存儲日期時間,因爲Django中有時區概念,下方會詳解此類型。 |
EmailField() |
在數據庫中爲varchar 類型,用於存儲郵箱,默認長度爲254,且不能爲空(配合表單會檢測郵箱合法性) |
FileField() |
在數據庫中爲varchar 類型,用於存儲文件(存儲的文件路徑) |
ImageField() |
在數據庫中爲varchar 類型,用於存儲圖片(存儲圖標需要安裝pip install Pillow ) |
FloatField() |
在數據庫中爲double 類型,浮點類型,用於存儲浮點數 |
SmallIntegerField() |
在數據庫中爲smallint 類型,默認長度爲6的短整數類型,值的區間在-32768, 32767 |
IntegetField() |
在數據庫中爲int 類型,默認長度爲11的整數類型,值的區間在-2147483648, 2147483647 |
BigIntegerField() |
在數據庫中爲bigint 類型,默認長度爲20的長整數類型,值的區間在-9223372036854775808, 9223372036854775807 |
PositiveSmallIntegerField() |
在數據庫中爲smallint 類型,默認長度爲5的非負小整數,值的區間在0, 32767 |
PositiveIntegerField() |
在數據庫中爲int 類型,默認長度爲10的非負整數,值的區間在0, 2147483647 |
TextField() |
在數據庫中爲longtext 類型,長整數類型,通常使用大量文本時纔會使用此類型 |
UUIDField() |
在數據庫中爲char 類型,只能存儲UUID格式字符串,(UUID爲一個32位的全球唯一的字符串,一般用來作爲主鍵) |
URLField() |
在數據庫中爲varchar 類型,用於存儲URL格式字符串,默認長度爲200。 |
Django日期類型詳解
Django中日期爲分時區日期,其中在setting.py中可以設置當前時區,默認爲協調世界時(UTC),在中國我們大多使用TIME_ZONE = Asia/Shanghai
這個時區。
如果不想引入時區的概念可以將USE_TZ = True
設爲Flast,即可關閉時區
Django建議大家使用from django.utils.timezone import now
保存當前時間
存儲日期除了我上述介紹的方式外,還有DateField
與TimeField
,他們分別只能存儲日期與時間,使用較少。
日期的field有兩個特殊的屬性,分別是
auto_now=True
自動創建—無論添加或修改,都是當前操作的時間auto_now_add=True
自動創建—永遠是創建時的時間
Field屬性中常用參數
常用參數 | 作用 |
---|---|
null | 是否允許爲空(默認爲False) |
db_column | 此字段在數據庫中的名稱(如果不設置此參數,默認名稱爲屬性名) |
default | 默認值,可以是一個值,也可是一個函數 |
primary_key | 是否爲主鍵,默認爲Falst |
unique | 在表中此字段值是否唯一(手機號郵箱號等常用) |
max_length | 指定字段長度 |
模型中Meta配置
對於一些模型級別的配置。我們可以在模型中定義一個類,叫做Meta(此類必須放置在數據庫模型中,也就是集成了models.Model的類中)。然後在這個類中添加一些類屬性來控制模型的作用。
db_table
我們使用ORM創建的表名默認爲APP名_類名
,如果我們不想使用此名稱,可以在Meta類(class Meta)寫入db_table指定名稱
ordering
ordering用於指定讀取數據時,數據的排序方式,比如ordering = ['id']
爲id的升序,ordering = ['-id']
爲id的降序
class People(models.Model):
id = models.AutoField(primary_key=True)
角色 = models.CharField(max_length=20)
介紹 = models.TextField()
當前時間 = models.DateTimeField()
class Meta:
db_table = '模型創建測試表'
ordering = ['id']