ORM全拼:Object-Relation-Mapping翻譯就是對象關係映射。在MVC/MTV設計模式中的Model模塊中都包括ORM。主要實現模型對象到關係數據庫數據的映射。好比:把數據庫表中每條記錄映射爲一個模型對象html
優勢:python
只須要面向對象編程,不須要面向數據庫編寫代碼。對數據庫的操做都轉化爲對類屬性和方法的操做,不用編寫各類數據庫的sql語句mysql
實現了數據模型與數據庫的解耦,屏蔽了不一樣數據庫操做上的差別。經過簡單地配置就能夠輕鬆更換數據庫,而不須要修改代碼。git
缺點:sql
相比較直接使用SQL語句操做數據庫,有性能缺失。會轉化爲sql語句在執行。多了流程。根據對象的操做轉換成sql語句,根據查詢的結果轉化成對象,在映射過程當中有性能損失。數據庫
一、建立項目django
django-admin startproject BookManager
二、建立應用編程
python manage.py startapp Book
三、安裝應用設計模式
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'Book', ]
四、本地化瀏覽器
LANGUAGE_CODE = 'zh-Hans' TIME_ZONE = 'Asia/Shanghai'
五、建立模板路徑
在應用同級目錄下,建立templates模板文件
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', #模板路徑 'DIRS': [os.path.join(BASE_DIR,"templates")], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]
六、應用中分發路由
from django.contrib import admin from django.urls import path from Book import views urlpatterns = [ path('admin/', admin.site.urls), path('booklist/', views.bookList), ]
七、準備視圖函數
from django.shortcuts import render from django.http import HttpResponse # Create your views here. #書籍列表信息視圖 def bookList(request): return HttpResponse("ok")
八、開啓服務器,測試項目
python manage.py runserver
http://127.0.0.1:8000/
Django項目默認採用sqlite3數據庫,可是Web項目首選的數據庫是mysql數據庫,因此咱們須要修改Django項目默認的數據庫爲mysql數據庫
pymysql包用於跟mysql數據庫交互,沒有pymysql包會報錯:Error loading MySQLdb module: No module named MySQLdb
pip3 install pymysql
pymysql包配置:
默認配置:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
配置mysql數據庫:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 數據庫引擎 'NAME': 'Bookdb', # 數據庫名稱 'HOST': 'localhost', # 數據庫主機(建議使用主機真實IP) 'PORT': '3306', # 數據庫端口 'USER': 'root', # 數據庫用戶名 'PASSWORD': '', # 數據庫密碼 } }
打開cmd終端,打開數據庫,連接數據庫。建立數據庫名字:
create database bookdb charset=utf8;
use Bookdb;
show tables;
#退出數據庫 exit
當爲項目建立好mysql類型的數據庫bookdb後,須要建立模型類並生成和執行遷移表,從而建立數據庫表。可是在建立模型類須要指定模型屬性和屬性類型。
模型屬性和屬性類型,也就是對應數據庫中的字段和字段類型
# 書籍信息模型 class Book(models.Model): name = models.CharField(max_length=20) #圖書名稱
備註:屬性名一、不容許使用python的保留關鍵字,二、不容許使用mysql的保留關鍵字,三、不容許使用連續的下劃線,由於Django的查詢語法就是連續的下劃線。
AutoField:自動增加的IntegerField,一般不用指定,不指定時Django會自動建立屬性名爲id的自動增加屬性
BooleanField:布爾字段,值爲True或False
NullBooleanField:支持Null、True、False三種值
CharField(max_length=字符長度):字符串參數max_length表示最大字符個數
TextField:大文本字段,通常超過4000個字符時使用
IntegerField:整數
DecimalField(max_digits=None, decimal_places=None):能夠指定精度的十進制浮點數 參數max_digits表示總位數 參數decimal_places表示小數位數
FloatField:浮點數
DateField[auto_now=False, auto_now_add=False]):日期,參數auto_now表示每次保存對象時,自動設置該字段爲當前時間,用於"最後一次修改"的時間戳,
它老是使用當前日期,默認爲false 參數auto_now_add表示當對象第一次被建立時自動設置當前時間,用於建立的時間戳,它老是使用當前日期,默認爲false 參數auto_now_add和auto_now是相互排斥的,組合將會發生錯誤
TimeField:時間,參數同DateField
DateTimeField:日期時間,參數同DateField
FileField:上傳文件字段
ImageField:繼承於FileField,對上傳的內容進行校驗,確保是有效的圖片
經過選項實現對字段的約束
null:若是爲True,表示容許爲空,默認值是False
blank:若是爲True,則該字段容許爲空白,默認值是False
對比:null是數據庫範疇的概念,blank是表單驗證範疇的
db_column:字段的名稱,若是未指定,則使用屬性的名稱
db_index:若值爲True, 則在表中會爲此字段建立索引,默認值是False
default:默認值
primary_key:若爲True,則該字段會成爲模型的主鍵字段,默認值是False,通常做爲AutoField的選項使用
unique:若是爲True, 這個字段在表中必須有惟一值,默認值是False
注意:Django會自動爲表建立主鍵字段
若是使用選項設置某屬性爲主鍵字段後,Django不會再建立自動增加的主鍵字段
默認建立的主鍵字段爲id,可使用pk代替,pk全拼爲primary key
關係型數據庫的關係包括三種類型:
ForeignKey:一對多,將字段定義在多的一端中
ManyToManyField:多對多,將字段定義在任意一端中
OneToOneField:一對一,將字段定義在任意一端中
能夠維護遞歸的關聯關係,使用self指定,詳見「自關聯」
做用:在模型類中定義 元類Meta,用於設置元信息,用db_table 自定義表的名字
# 書籍信息模型 class BookInfo(models.Model): name = models.CharField(max_length=20) #圖書名稱 class Meta: #元信息類 db_table = 'bookinfo' #自定義表的名字
#在數據庫中更改表名
desc 代表
定義的模型能夠是這個樣子
#書籍信息 ("與時間作朋友","2002-08-22","45.21","中信出版社","athor_id") #人物信息 ("李笑來","男","年齡","家庭地址","電話")
所以模型代碼以下:
from django.db import models # Create your models here. #建立做者信息表 class Authors(models.Model): name = models.CharField(max_length=20)#做者名字 gender = models.BooleanField(default=True)#性別 age = models.IntegerField()#年齡 addr = models.CharField(max_length=60) tel = models.IntegerField() #元類修改表名 class Meta: db_table = "authors" #建立書籍信息 class Books(models.Model): name = models.CharField(max_length=20)#書名 pub_data = models.DateField(null=True)#出版日期 #參數max_digits表示總位數 參數decimal_places表示小數位數 price = models.DecimalField(max_digits=8,decimal_places=2)#價格 publish = models.CharField(max_length=20) #外鍵 將字段定義在多的一端中 級聯刪除 author = models.ForeignKey(Authors,on_delete=models.CASCADE) #修改表名(元類) class Meta: db_table = "books"
模型遷移不要忘記:
python manage.py makemigrations
python manage.py migrate
查看錶結構:
去站點插點數據(若是嫌慢就用sql語句插數據)(須要設置站點,一、註冊管理模型類,須要顯示完整的,重寫類,list_display從新註冊,啓動超級用戶,python manage.py createsuperuser)
網址:http://127.0.0.1:8000/booklist
路由部分:
from django.contrib import admin from django.urls import path from Book import views urlpatterns = [ path('admin/', admin.site.urls), path('booklist/', views.bookList), ]
視圖部分:
from django.shortcuts import render from django.http import HttpResponse # Create your views here. from Book.models import * #書籍列表信息視圖 def bookList(request): #查詢數據庫書籍信息 booklist = Books.objects.all() #構造上下文 content = {"booklist":booklist} #傳入模板 返回由視圖發送給瀏覽器 return render(request,"Book/booklist.html",content)
模板部分:
from django.db import models # Create your models here. #建立做者信息表 class Authors(models.Model): name = models.CharField(max_length=20)#做者名字 gender = models.BooleanField(default=True)#性別 age = models.IntegerField()#年齡 addr = models.CharField(max_length=60) tel = models.IntegerField() #元類修改表名 class Meta: db_table = "authors" def __str__(self): return self.name #建立書籍信息 class Books(models.Model): name = models.CharField(max_length=20)#書名 pub_data = models.DateField(null=True)#出版日期 #參數max_digits表示總位數 參數decimal_places表示小數位數 price = models.DecimalField(max_digits=8,decimal_places=2)#價格 publish = models.CharField(max_length=20) #外鍵 將字段定義在多的一端中 級聯刪除 author = models.ForeignKey(Authors,on_delete=models.CASCADE) #修改表名(元類) class Meta: db_table = "books" def __str__(self): return self.name
結果:
str : 在將對象轉換成字符串時會被調用
save : 將模型對象保存到數據庫表中
delete : 將模型對象從數據庫表中刪除
objects模型屬性
objects : 管理器對象是Manager類型的對象,定義在from django.db import models中用於模型對象和數據庫交互
是默認自動生成的屬性,可是能夠自定義管理器對象自定義管理器對象後,Django再也不生成默認管理器對象objects
自定義管理器對象,本來默認的是objects = models.Manager(),能夠自定義,從新實例化管理器對象。
all():返回全部的數據
filter():返回知足條件的數據
exclude():返回知足條件以外的數據,至關於sql語句中where部分的not關鍵字
order_by():返回排序後的數據
get():返回單個知足條件的對象 若是未找到會引起"模型類.DoesNotExist"異常 若是多條被返回,會引起"模型類.MultipleObjectsReturned"異常 count():返回當前查詢的總條數 aggregate():聚合 exists():判斷查詢集中是否有數據,若是有則返回True,沒有則返回False
一、惰性執行:建立查詢集不會訪問數據庫,直到在模板中調用數據時,纔會訪問數據庫。
調用數據的狀況包括迭代、序列化、與if合用
二、緩存:查詢集的結果被存下來以後,再次查詢相同數據時會使用以前緩存的數據
每一個查詢集都包含一個緩存來最小化對數據庫的訪問,第一次查詢數據後,Django會將查詢集緩存起來,並返回請求的結果,再次查詢相同數據時將重用緩存的結果。
若是獲取一個對象,直接使用[0]
,等同於[0:1].get()
[0]
引起IndexError
異常,[0:1].get()
引起DoesNotExist
異常filter(模型屬性__條件運算符=值) 例: filter(name__contains='時')
說明:查詢語句是屬性名稱和比較運算符間使用兩個下劃線相連,因此定義的模型屬性名不能包括多個下劃線
實現sql中where的功能,能夠調用過濾器filter()、exclude()、get()
# 1.查詢id爲1的書籍 # 2.查詢書名包含‘時間’的書籍 # 3.查詢書名以‘觀’結尾的書籍 # 4.查詢書名不爲空的書籍 # 5.查詢價格爲50或52的書籍 # 6.查詢價格大於52的書籍 # 7.查詢id不等於3的書籍 # 8.查詢2019年發表的書籍 # 9.查詢2000年1月1往後發表的書籍
1.查詢id爲1的書籍(exact:判斷相等)
#一、查詢id爲1的書籍(exact: 判斷相等)<QuerySet [<Books: 與時間作朋友>]>
book = Books.objects.all()
book1 = book.filter(id__exact=1)
2.查詢書名包含‘時間’的書籍(contains:是否包含)
book = Books.objects.all() book1 = book.filter(name__contains="局觀")
#<QuerySet [<Books: 大局觀>]>
3.查詢書名以‘與’開始的書籍(startswith,endswith)
book = Books.objects.all() book1 = book.filter(name__startswith="與") print(book1)
4.查詢書名不爲空的書籍(isnull:是否爲null)
book = Books.objects.all() book1 = book.filter(name__isnull=False) print(book1)
5.查詢價格爲50或52的書籍(in:是否包含在這範圍內)
book = Books.objects.all() book1 = book.filter(price__in=[50,52]) print(book1)
6.查詢價格大於52的書籍(gt,gte,it,ite:大於,大於等於,小於,小於等於)
book = Books.objects.all() book1 = book.filter(price__gt=52) print(book1)
7.查詢id不等於3的書籍(exclude:條件之外的數據)
book = Books.objects.all() book1 = book.exclude(id=3) print(book1)
8.查詢2019年發表的書籍(year\month\day\week_day\hour\minute\second:對日期時間類型的屬性進行運算)
book = Books.objects.all() book1 = book.filter(pub_data__year=2019) print(book1)
9.查詢2000年1月1往後發表的書籍
from datetime import date book = Books.objects.all() book1 = book.filter(pub_data__gt=date(2000,1,1)) print(book1)
備註:
exact
、contains
、startswith
、endswith
運算符都區分大小寫i
表示不區分大小寫iexact
、icontains
、istartswith
、iendswith
其餘特殊查詢下一節分享總結(F和Q查詢,聚合函數,關聯查詢)