1. 程式人生 > >Django模型(使用mysql資料庫,定義模型)

Django模型(使用mysql資料庫,定義模型)

先說說orm吧,MVC框架中包括一個重要的部分,就是ORM,它實現了資料模型與資料庫的解耦,即資料模型的設計不需要依賴於特定的資料庫,通過簡單的配置就可以輕鬆更換資料庫,當然Django雖然是MVT但是也有ORM這個東西

ORM

ORM是“物件-關係-對映”的簡稱,主要任務是:
1.根據物件的型別生成表結構
2.將物件、列表的操作,轉換為sql語句
3.將sql查詢到的結果轉換為物件、列表

這極大的減輕了開發人員的工作量,不需要面對因資料庫變更而導致的無效勞動
Django中的模型包含儲存資料的欄位和約束,對應著資料庫中唯一的表
在這裡插入圖片描述

使用Mysql資料庫

1.在虛擬環境中安裝mysql包
2.在mysql中建立資料庫
3.開啟settings.py檔案,修改DATABASES項

*****************1、在虛擬環境中安裝mysql包*****************
pip install PyMySQL

MySQLdb 只適用於python2.x,發現python3上的pip裝不上。它在py3的替代品是:pip install PyMySQL
而django預設的還是使用MySQLdb:執行會報:ImportError: No module named 'MySQLdb'
解決:
在站點的 __init__.py 檔案中新增

import pymysql
pymysql.install_as_MySQLdb()


*****************2、在mysql中建立資料庫表*****************

create database test2 charset=utf8

*****************3、修改DATABASES項*****************
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test2',
        'USER': '使用者名稱',
        'PASSWORD': '密碼',
        'HOST': '資料庫伺服器ip,本地可以使用localhost',
        'PORT': '埠,預設為3306',
    }
}

mysql的日誌檔案(我們可以檢視日誌檔案來加深理解)

mysql.log是mysql的日誌檔案,裡面記錄的對MySQL資料庫的操作記錄。預設情況下mysql的日誌檔案沒有產生,需要修改mysql的配置檔案,步驟如下:

  1. 使用下面的命令開啟mysql的配置檔案,去除68,69行的註釋,然後儲存。
    sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
    2)重啟mysql服務,就會產生mysql日誌檔案。
    sudo service mysql restart
    3)開啟MySQL的日誌檔案。
    /var/log/mysql/mysql.log 是mysql日誌檔案所在的位置。
    使用下面的命令可以實時檢視mysql的日誌檔案:
    sudo tail -f /var/log/mysql/mysql.log

開發流程

1.在models.py中定義模型類,要求繼承自models.Model
2.把應用加入settings.py檔案的installed_app項
3.生成遷移檔案
4.執行遷移生成表
5.使用模型類進行crud操作

使用資料庫生成模型類

python manage.py inspectdb > appname/models.py

python manage.py inspectdb > booktest/models.py

一般不使用,因為預設生成的內容多而複雜。所以一般是自己定義模版類。

定義模型

1.在模型中定義屬性,會生成表中的欄位
2.django根據屬性的型別確定以下資訊:
a)當前選擇的資料庫支援欄位的型別
b)渲染管理表單時使用的預設html控制元件
c)在管理站點最低限度的驗證
3.django會為表增加自動增長的主鍵列,每個模型只能有一個主鍵列,如果使用選項設定某屬性為主鍵列後,則django不會再生成預設的主鍵列
4.屬性命名限制
a)不能是python的保留關鍵字
b)由於django的查詢方式,不允許使用連續的下劃線

屬性

一種是限定資料庫端的,另外一種是限定後臺admin的
1.定義屬性時,需要欄位型別
2.欄位型別被定義在django.db.models.fields目錄下,為了方便使用,被匯入到django.db.models中
3.使用方式
a)匯入from django.db import models
b)通過models.Field建立欄位型別的物件,賦值給屬性
4.對於重要資料都做邏輯刪除,不做物理刪除,實現方法是定義isDelete屬性,型別為BooleanField,預設值為False

欄位型別

1.AutoField:一個根據實際ID自動增長的IntegerField,通常不指定
a)如果不指定,一個主鍵欄位將自動新增到模型中
2.BooleanField:true/false 欄位,此欄位的預設表單控制是CheckboxInput
3.NullBooleanField:支援null、true、false三種值
4.CharField(max_length=字元長度):字串,預設的表單樣式是 TextInput
5.TextField:大文字欄位,一般超過4000使用,預設的表單控制元件是Textarea
6.IntegerField:整數
7.DecimalField(max_digits=None, decimal_places=None):使用python的Decimal例項表示的十進位制浮點數
a)DecimalField.max_digits:位數總數
b)DecimalField.decimal_places:小數點後的數字位數
8.FloatField:用Python的float例項來表示的浮點數
9.DateField[auto_now=False, auto_now_add=False]):使用Python的datetime.date例項表示的日期
a)引數DateField.auto_now:每次儲存物件時,自動設定該欄位為當前時間,用於"最後一次修改"的時間戳,它總是使用當前日期,預設為false
b)引數DateField.auto_now_add:當物件第一次被建立時自動設定當前時間,用於建立的時間戳,它總是使用當前日期,預設為false
c)該欄位預設對應的表單控制元件是一個TextInput. 在管理員站點添加了一個JavaScript寫的日曆控制元件,和一個“Today"的快捷按鈕,包含了一個額外的invalid_date錯誤訊息鍵
d)auto_now_add, auto_now, and default 這些設定是相互排斥的,他們之間的任何組合將會發生錯誤的結果
10.TimeField:使用Python的datetime.time例項表示的時間,引數同DateField
11.DateTimeField:使用Python的datetime.datetime例項表示的日期和時間,引數同DateField
12.FileField:一個上傳檔案的欄位
13.ImageField:繼承了FileField的所有屬性和方法,但對上傳的物件進行校驗,確保它是個有效的image

欄位選項

1.通過欄位選項,可以實現對欄位的約束
2.在欄位物件時通過關鍵字引數指定
3.null:如果為True,Django 將空值以NULL 儲存到資料庫中,預設值是 False
4.blank:如果為True,則該欄位允許為空白,預設值是 False
a)對比:null是資料庫範疇的概念,blank是表單驗證證範疇的
5.db_column:欄位的名稱,如果未指定,則使用屬性的名稱
6.db_index:若值為 True, 則在表中會為此欄位建立索引,在設計資料庫的時候建立。
7.default:預設值
8.primary_key:若為 True, 則該欄位會成為模型的主鍵欄位
9.unique:如果為 True, 這個欄位在表中必須有唯一值

元選項

在模型類中定義類Meta,用於設定元資訊

1.元資訊db_table:定義資料表名稱,推薦使用小寫字母,資料表的預設名稱

<app_name>_<model_name>

2.ordering:物件的預設排序欄位,獲取物件的列表時使用,接收屬性構成的列表

class BookInfo(models.Model):
    ...
    class Meta():
        ordering = ['id']

3.字串前加-表示倒序,不加-表示正序

class BookInfo(models.Model):
    ...
    class Meta():
        ordering = ['-id']
        排序會增加資料庫的開銷