MTV中的M表示Model模型,Django模型是使用Python代碼對數據庫中數據的描述,是數據的結構,等同於SQL中的create table語句。
ORM:Object Relational Mapping(關係對象映射),ORM在django中自帶的一個重要組成部分,MVC框架中包括一個重要的部分,就是ORM,它實現了數據模型與數據庫的解耦,即數據模型的設計不須要依賴於特定的數據庫,經過簡單的配置就能夠輕鬆更換數據庫。python
ORM主要任務是:
根據對象的類型生成表結構
將對象、列表的操做,轉換爲sql語句
將sql查詢到的結果轉換爲對象、列表mysql
項目建立好了之後打開setting.py配置文件,找到DATABASES默認使用的是sqlite3,若是須要換其餘數據庫,只須要修改這個地方便可。
其實django.db.backends.sqlite3 也是django下面提供好了的,能夠在安裝路徑查看到,C:UsersAdministratorAppDataLocalProgramsPythonPython36Libsite-packagesdjangodbbackendsgit
下面咱們來修改下數據庫配置,修改成連接mysql數據庫, 修改setting.py中的代碼以下:sql
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'test', #要鏈接的數據庫名 'USER': 'root', #登陸的帳號 'PASSWORD': '123456', #登陸的密碼 'HOST': 'localhost', #數據庫服務器ip,本地可使用localhost 'PORT': '3306', #端口,默認爲3306 } }
1.在models.py中定義模型類,要求繼承自models.Model
2.把應用加入settings.py文件的installed_app項
3.生成遷移文件
4.執行遷移生成表
5.使用模型類進行crud操做數據庫
一個項目下能夠包含多個應用,建立應用經過:python manage.py startapp test1app(應用名),執行語句會報錯以下
說沒有MySQLdb這個模塊,我本地使用的python版本爲3.6.3,在3.x中mysql操做的模塊爲pymysql,pip install pymysql,若是pyhton版本爲2.x須要安裝 pip install mysql-python.django
模板都安裝成功後,3.x中還須要在項目的__init__.py文件中加入:服務器
import pymysql pymysql.install_as_MySQLdb()
這個時候再次執行建立應用語句便可建立成功,應用建立成功後,在setting.py中添加建立的應用。
INSTALLED_APPS表示Django中激活的應用,最後一個爲咱們手動添加的應用,上述的都是Django中默認激活的應用。session
INSTALLED_APPS = ( 'django.contrib.admin',#管理後臺 'django.contrib.auth', #身份驗證系統 'django.contrib.contenttypes',#內容類型框架 'django.contrib.sessions',#會話框架 'django.contrib.messages',#消息框架 'django.contrib.staticfiles',#管理靜態文件的框架 'test1' #新添加的應用 )
在模型中定義屬性,定義好的屬性會生成爲表中的字段,django會爲表添加自動增加的主鍵列,每一個模型只能有一個主鍵列,若是本身指定了主鍵列後,django不會再生成。app
屬性的命名:1. 不能是python的關鍵字 2. 因爲django的查詢方式,不容許使用連續的下劃線框架
定義屬性時,須要字段類型
字段類型被定義在django.db.models.fields目錄下,爲了方便使用,被導入到django.db.models中
使用方式:導入from django.db import models
經過models.Field建立字段類型的對象,賦值給屬性
對於重要數據都作邏輯刪除,不作物理刪除,實現方法是定義isDelete屬性,類型爲BooleanField,默認值爲False
字段類型:
AutoField:一個根據實際ID自動增加的IntegerField,一般不指定
若是不指定,一個主鍵字段將自動添加到模型中
BooleanField:true/false 字段,此字段的默認表單控制是CheckboxInput
NullBooleanField:支持null、true、false三種值
CharField(max_length=字符長度):字符串,默認的表單樣式是 TextInput
TextField:大文本字段,通常超過4000使用,默認的表單控件是Textarea
IntegerField:整數
DecimalField(max_digits=None, decimal_places=None):使用python的Decimal實例表示的十進制浮點數
DecimalField.max_digits:位數總數
DecimalField.decimal_places:小數點後的數字位數
FloatField:用Python的float實例來表示的浮點數
DateField[auto_now=False, auto_now_add=False]):使用Python的datetime.date實例表示的日期
參數DateField.auto_now:每次保存對象時,自動設置該字段爲當前時間,用於"最後一次修改"的時間戳,它老是使用當前日期,默認爲false
參數DateField.auto_now_add:當對象第一次被建立時自動設置當前時間,用於建立的時間戳,它老是使用當前日期,默認爲false
該字段默認對應的表單控件是一個TextInput. 在管理員站點添加了一個JavaScript寫的日曆控件,和一個「Today"的快捷按鈕,包含了一個額外的invalid_date錯誤消息鍵
auto_now_add, auto_now, and default 這些設置是相互排斥的,他們之間的任何組合將會發生錯誤的結果
TimeField:使用Python的datetime.time實例表示的時間,參數同DateField
DateTimeField:使用Python的datetime.datetime實例表示的日期和時間,參數同DateField
FileField:一個上傳文件的字段
ImageField:繼承了FileField的全部屬性和方法,但對上傳的對象進行校驗,確保它是個有效的image
字段選項:經過字段選項,能夠實現對字段的約束(在字段對象時經過關鍵字參數指定)
null:若是爲True,Django 將空值以NULL 存儲到數據庫中,默認值是 False
blank:若是爲True,則該字段容許爲空白,默認值是 False
對比:null是數據庫範疇的概念,blank是表單驗證證範疇的
db_column:字段的名稱,若是未指定,則使用屬性的名稱
db_index:若值爲 True, 則在表中會爲此字段建立索引
default:默認值
primary_key:若爲 True, 則該字段會成爲模型的主鍵字段
unique:若是爲 True, 這個字段在表中必須有惟一值
關係的類型包括:
ForeignKey:一對多,將字段定義在多的端中
ManyToManyField:多對多,將字段定義在兩端中
OneToOneField:一對一,將字段定義在任意一端中
元選項:
在模型類中定義類Meta,用於設置元信息,元信息db_table:定義數據表名稱,推薦使用小寫字母,數據表的默認名稱(<app_name>_<model_name>)
ordering:對象的默認排序字段,獲取對象的列表時使用,接收屬性構成的列表
class BookInfo(models.Model): btitle=models.CharField(max_length=20) bpub_date=models.DateTimeField() bread=models.IntegerField(default=0) bcommet=models.IntegerField(default=0) isDelete=models.BooleanField(default=False) class Meta: db_table="bookinfo" ordering=['id'] #正序 ordering=['-id'] #倒序
瞭解了模型類中屬性的一些信息以後來開始定義兩個模型類,在建立好的應用中找到model.py,編寫模型類:
from django.db import models # Create your models here. class BookInfo(models.Model): btitle=models.CharField(max_length=20) bpub_date=models.DateTimeField() bread=models.IntegerField(default=0) bcommet=models.IntegerField(default=0) isDelete=models.BooleanField(default=False) class Meta: db_table="bookinfo" class HeroInfo(models.Model): hname=models.CharField(max_length=20) hgender=models.BooleanField(default=True) isDelete=models.BooleanField(default=True) hcontent=models.CharField(max_length=100) hbook=models.Foreignkey('BookInfo') #設置外鍵
模型定義好了之後,確認模型有效以後,執行下述命令,告訴django你對模型作了修改(生成遷移)django把對模型的改動存儲在遷移中,遷移就是磁盤中的文件。
經過執行makemigrations告訴Django,對模型作了什麼更改,Django接收到以後在migrations下生成一個0001_initial.py文件,這個文件裏面就是記錄咱們對模型作了哪些修改
上面文件看不懂,沒有關係,並不要求你們去閱讀它,若是你懂數據庫的sql語句,咱們能夠經過下面指令來看下剛剛的Django爲咱們作了什麼 python manage.py sqlmigrate test1app 0001
不懂SQL就能夠跳過這段了,懂SQL的同窗會發現生成的代表和咱們定義的不一樣,如下列了幾個說明點:
表名是自動生成的,由app的名字(polls)和模型名字的小寫字母組合而成 —— question和choice
主鍵(id)是自動添加的。(你也能夠重寫這個行爲。)
按照慣例,Django會在外鍵的字段名後面添加 "_id"。(是的,你依然能夠重寫這個行爲。)
外鍵關係由FOREIGN KEY約束顯式聲明。不用在乎DEFERRABLE部分;它只是告訴PostgreSQL直到事務的最後再執行外鍵關聯。
sqlmigrate命令並不會在你的數據庫上真正運行遷移文件 —— 它只是把Django 認爲須要的SQL打印在屏幕上以讓你可以看到。
接下來很關鍵,由於上面步驟下來其實數據庫尚未建立,執行python manage.py migrate
執行的過程經過檢測剛剛在migrations下生成的文件,知道咱們對數據要作哪些操做翻譯後執行
migrate命令會找出全部尚未被應用的遷移文件(Django使用數據庫中一個叫作django_migrations的特殊表來追蹤哪些遷移文件已經被應用過),而且在你的數據庫上運行它們 —— 本質上來說,就是使你的數據庫模式和你改動後的模型進行同步。
遷移功能很是強大,可讓你在開發過程當中不斷修改你的模型而不用刪除數據庫或者表而後再從新生成一個新的 —— 它專一於升級你的數據庫且不丟失數據
模型變動的三個步驟:
修改你的模型(在models.py文件中)。
運行python manage.py makemigrations ,爲這些修改建立遷移文件
運行python manage.py migrate ,將這些改變動新到數據庫中
類的屬性,objects:是Manager類型的對象,用於與數據庫進行交互,當定義模型類時沒有指定管理器,則Django會爲模型類提供一個名爲objects的管理器
class BookInfo(models.Model): ... books = models.Manager()
當爲模型類指定管理器後,django再也不爲模型類生成名爲objects的默認管理器
管理器Manager
管理器是Django的模型進行數據庫的查詢操做的接口,Django應用的每一個模型都擁有至少一個管理器
自定義管理器類主要用於兩種狀況
狀況一:向管理器類中添加額外的方法:見下面「建立對象」中的方式二
狀況二:修改管理器返回的原始查詢集:重寫get_queryset()方法
class BookInfoManager(models.Manager): def get_queryset(self): return super(BookInfoManager, self).get_queryset().filter(isDelete=False) class BookInfo(models.Model): ... books = BookInfoManager()
實例的屬性
DoesNotExist:在進行單個查詢時,模型的對象不存在時會引起此異常,結合try/except使用
實例的方法
str (self):重寫object方法,此方法在將對象轉換成字符串時會被調用
save():將模型對象保存到數據表中
delete():將模型對象從數據表中刪除
在管理器上調用過濾器方法會返回查詢集,查詢集表示從數據庫中獲取的對象集合,查詢集能夠含有零個、一個或多個過濾器,過濾器基於所給的參數限制查詢的結果,從Sql的角度,查詢集和select語句等價,過濾器像where和limit子句
惰性執行:建立查詢集不會帶來任何數據庫的訪問,直到調用數據時,纔會訪問數據庫
返回查詢集的方法,稱爲過濾器all()filter()exclude()order_by()values():一個對象構成一個字典,而後構成一個列表返回