09django模型[ORM框架]

一、ORM

ORM概念

對(duì)象關(guān)系映射(Object Relational Mapping,簡(jiǎn)稱ORM)模式是一種為了解決面向?qū)ο笈c關(guān)系數(shù)據(jù)庫(kù)存在的互不匹配的現(xiàn)象的技術(shù)。

簡(jiǎn)單的說,ORM是通過使用描述對(duì)象和數(shù)據(jù)庫(kù)之間映射的元數(shù)據(jù),將程序中的對(duì)象自動(dòng)持久化到關(guān)系數(shù)據(jù)庫(kù)中。

ORM在業(yè)務(wù)邏輯層和數(shù)據(jù)庫(kù)層之間充當(dāng)了橋梁的作用。

ORM由來

讓我們從O/R開始。字母O起源于"對(duì)象"(Object),而R則來自于"關(guān)系"(Relational)。

幾乎所有的軟件開發(fā)過程中都會(huì)涉及到對(duì)象和關(guān)系數(shù)據(jù)庫(kù)。在用戶層面和業(yè)務(wù)邏輯層面,我們是面向?qū)ο蟮?。?dāng)對(duì)象的信息發(fā)生變化的時(shí)候,我們就需要把對(duì)象的信息保存在關(guān)系數(shù)據(jù)庫(kù)中。

按照之前的方式來進(jìn)行開發(fā)就會(huì)出現(xiàn)程序員會(huì)在自己的業(yè)務(wù)邏輯代碼中夾雜很多SQL語(yǔ)句用來增加、讀取、修改、刪除相關(guān)數(shù)據(jù),而這些代碼通常都是重復(fù)的。

ORM的優(yōu)勢(shì)

ORM解決的主要問題是對(duì)象和關(guān)系的映射。它通常把一個(gè)類和一個(gè)表一一對(duì)應(yīng),類的每個(gè)實(shí)例對(duì)應(yīng)表中的一條記錄,類的每個(gè)屬性對(duì)應(yīng)表中的每個(gè)字段。

ORM提供了對(duì)數(shù)據(jù)庫(kù)的映射,不用直接編寫SQL代碼,只需像操作對(duì)象一樣從數(shù)據(jù)庫(kù)操作數(shù)據(jù)。

讓軟件開發(fā)人員專注于業(yè)務(wù)邏輯的處理,提高了開發(fā)效率。

ORM的劣勢(shì)

ORM的缺點(diǎn)是會(huì)在一定程度上犧牲程序的執(zhí)行效率。

ORM用多了SQL語(yǔ)句就不會(huì)寫了,關(guān)系數(shù)據(jù)庫(kù)相關(guān)技能退化...

ORM總結(jié)

ORM只是一種工具,工具確實(shí)能解決一些重復(fù),簡(jiǎn)單的勞動(dòng)。這是不可否認(rèn)的。

但我們不能指望某個(gè)工具能一勞永逸地解決所有問題,一些特殊問題還是需要特殊處理的。

但是在整個(gè)軟件開發(fā)過程中需要特殊處理的情況應(yīng)該都是很少的,否則所謂的工具也就失去了它存在的意義。

Django框架中ORM示意圖

選區(qū)_258
ORM02

1. 創(chuàng)建項(xiàng)目test2

今天演示使用MySQL數(shù)據(jù)庫(kù),這是Web項(xiàng)目首選的數(shù)據(jù)庫(kù)。

進(jìn)入虛擬環(huán)境h1_django。

workon h1_django

在/home/python/pytest目錄下創(chuàng)建項(xiàng)目test2。

django-admin startproject test2

選區(qū)_222
選區(qū)_223

打開test2/settings.py文件,找到DATABASES項(xiàng),默認(rèn)使用SQLite3數(shù)據(jù)庫(kù)

選區(qū)_224

修改為使用MySQL數(shù)據(jù)庫(kù),代碼如下:

將引擎改為mysql,提供連接的主機(jī)HOST、端口PORT、數(shù)據(jù)庫(kù)名NAME、用戶名USER、密碼PASSWORD。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test2', #數(shù)據(jù)庫(kù)名字,
        'USER': 'root', #數(shù)據(jù)庫(kù)登錄用戶名
        'PASSWORD': 'mysql', #數(shù)據(jù)庫(kù)登錄密碼
        'HOST': 'localhost', #數(shù)據(jù)庫(kù)所在主機(jī)
        'PORT': '3306', #數(shù)據(jù)庫(kù)端口
    }
}

注意:數(shù)據(jù)庫(kù)test2 Django框架不會(huì)自動(dòng)生成,需要我們自己進(jìn)入mysql數(shù)據(jù)庫(kù)去創(chuàng)建。

下面是手動(dòng)創(chuàng)建數(shù)據(jù)庫(kù),打開新終端,在命令行登錄mysql,創(chuàng)建數(shù)據(jù)庫(kù)test2。

注意:設(shè)置字符集為utf8

create database test2 charset=utf8;

選區(qū)_225

返回第一個(gè)終端,進(jìn)入test2目錄,創(chuàng)建應(yīng)用booktest。

cd test2
python manage.py startapp booktest

選區(qū)_226

將應(yīng)用booktest注冊(cè)到項(xiàng)目中:打開test2/settings.py文件,找到INSTALLED_APPS項(xiàng),加入如下代碼:

'booktest',

選區(qū)_227

內(nèi)容復(fù)習(xí)

定義模型類

  • 模型類被定義在"應(yīng)用/models.py"文件中,此例中為"booktest/models.py"文件。
  • 模型類必須繼承自Model類,位于包django.db.models中。

提示:對(duì)于重要數(shù)據(jù)使用邏輯刪除。

示例演示

接下來首先以"圖書-英雄"管理為例進(jìn)行演示,復(fù)習(xí)一下之前的內(nèi)容。 1.打開booktest/models.py文件,定義模型類如下

from django.db import models

#定義圖書模型類BookInfo
class BookInfo(models.Model):
    btitle = models.CharField(max_length=20)#圖書名稱
    bpub_date = models.DateField()#發(fā)布日期
    bread = models.IntegerField(default=0)#閱讀量
    bcomment = models.IntegerField(default=0)#評(píng)論量
    isDelete = models.BooleanField(default=False)#邏輯刪除

#定義英雄模型類HeroInfo
class HeroInfo(models.Model):
    hname = models.CharField(max_length=20)#英雄姓名
    hgender = models.BooleanField(default=True)#英雄性別
    isDelete = models.BooleanField(default=False)#邏輯刪除
    hcomment = models.CharField(max_length=200)#英雄描述信息
    hbook = models.ForeignKey('BookInfo')#英雄與圖書表的關(guān)系為一對(duì)多,所以屬性定義在英雄模型類中

2.遷移 生成遷移文件

python manage.py makemigrations

生成遷移文件的時(shí)候出現(xiàn)錯(cuò)誤,把數(shù)據(jù)庫(kù)切換成了mysql,需要安裝pymysql模塊之后,Django框架才可以操作mysql數(shù)據(jù)庫(kù)。安裝命令如下:

pip install pymysql

選區(qū)_228

安裝成功之后,在test2/init.py文件中加上如下代碼:

import pymysql
pymysql.install_as_MySQLdb()

然后執(zhí)行如下命令

python manage.py makemigrations
python manage.py migrate

選區(qū)_229

打開數(shù)據(jù)庫(kù)的命令行,查看當(dāng)前所有表如下圖:

選區(qū)_230

表bookinfo結(jié)構(gòu)如:

默認(rèn)值并不在數(shù)據(jù)庫(kù)層面生效,而是在django創(chuàng)建對(duì)象時(shí)生效。

選區(qū)_231

表booktest_heroinfo結(jié)構(gòu)如下:

Django框架會(huì)根據(jù)關(guān)系屬性生成一個(gè)關(guān)系字段,并創(chuàng)建外鍵約束。

選區(qū)_233

3.測(cè)試數(shù)據(jù)

在數(shù)據(jù)庫(kù)命令行中,復(fù)制如下語(yǔ)句執(zhí)行,向booktest_bookinfo表中插入測(cè)試數(shù)據(jù):

insert into booktest_bookinfo(btitle,bpub_date,bread,bcomment,isDelete) values
('射雕英雄傳','1980-5-1',12,34,0),
('天龍八部','1986-7-24',36,40,0),
('笑傲江湖','1995-12-24',20,80,0),
('雪山飛狐','1987-11-11',58,24,0);

選區(qū)_256

再?gòu)?fù)制如下語(yǔ)句執(zhí)行,向booktest_heroinfo表中插入測(cè)試數(shù)據(jù):

insert into booktest_heroinfo(hname,hgender,hbook_id,hcomment,isDelete) values
('郭靖',1,1,'降龍十八掌',0),
('黃蓉',0,1,'打狗棍法',0),
('黃藥師',1,1,'彈指神通',0),
('歐陽(yáng)鋒',1,1,'蛤蟆功',0),
('梅超風(fēng)',0,1,'九陰白骨爪',0),
('喬峰',1,2,'降龍十八掌',0),
('段譽(yù)',1,2,'六脈神劍',0),
('虛竹',1,2,'天山六陽(yáng)掌',0),
('王語(yǔ)嫣',0,2,'神仙姐姐',0),
('令狐沖',1,3,'獨(dú)孤九劍',0),
('任盈盈',0,3,'彈琴',0),
('岳不群',1,3,'華山劍法',0),
('東方不敗',0,3,'葵花寶典',0),
('胡斐',1,4,'胡家刀法',0),
('苗若蘭',0,4,'黃衣',0),
('程靈素',0,4,'醫(yī)術(shù)',0),
('袁紫衣',0,4,'六合拳',0);

[圖片上傳失敗...(image-5b0062-1539520268469)]

4.定義視圖

打開booktest/views.py文件,定義視圖代碼如下:

from django.shortcuts import render,redirect
from booktest.models import *
from datetime import date

#查詢所有圖書并顯示
def index(request):
    list=BookInfo.objects.all()
    return render(request,'booktest/index.html',{'list':list})

#創(chuàng)建新圖書
def create(request):
    book=BookInfo()
    book.btitle = '流星蝴蝶劍'
    book.bpub_date = date(1995,12,30)
    book.save()
    #轉(zhuǎn)向到首頁(yè)
    return redirect('/')

#邏輯刪除指定編號(hào)的圖書
def delete(request,id):
    book=BookInfo.objects.get(id=int(id))
    book.delete()
    #轉(zhuǎn)向到首頁(yè)
    return redirect('/')

5.配置url 打開test2/urls.py文件,配置url如下:

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    #引入booktest的url配置
    url(r'^',include('booktest.urls')),
]

在booktest應(yīng)用下創(chuàng)建urls.py文件,代碼如下:

from django.conf.urls import url
from booktest import views

urlpatterns=[
    url(r'^$',views.index),
    url(r'^delete(\d+)/$',views.delete),
    url(r'^create/$',views.create),
]

6.創(chuàng)建模板 打開test2/settings.py文件,配置模板查找目錄TEMPLATES的DIRS。

'DIRS': [os.path.join(BASE_DIR,'templates')],

選區(qū)_234

創(chuàng)建templates/booktest/index.html文件。

選區(qū)_235

模板代碼如下:

<html>
<head>
    <title>復(fù)習(xí)案例</title>
</head>
<body>
<a href="/create/">創(chuàng)建</a>
<ul>
{%for book in list%}
    <li>{{book.btitle}}--<a href="/delete{{book.id}}/">刪除</a></li>
{%endfor%}
</ul>
</body>
</html>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 32,275評(píng)論 2 89
  • 模塊間聯(lián)系越多,其耦合性越強(qiáng),同時(shí)表明其獨(dú)立性越差( 降低耦合性,可以提高其獨(dú)立性)。軟件設(shè)計(jì)中通常用耦合度和內(nèi)聚...
    riverstation閱讀 2,203評(píng)論 0 8
  • 版權(quán): https://github.com/haiiiiiyun/awesome-django-cn Aweso...
    若與閱讀 23,558評(píng)論 3 240
  • 切換到創(chuàng)建項(xiàng)目的目錄 cd C:\Users\admin\Desktop\DjangoProject創(chuàng)建名為pr...
    在努力中閱讀 3,525評(píng)論 2 3
  • 凱特用掉第一條命那會(huì),只能說是懵懂無知。回想起來,竟然已經(jīng)記不太清了。只知道七年級(jí)時(shí)很喜歡班里的男孩子,明明只是自...
    春少邪閱讀 560評(píng)論 6 2

友情鏈接更多精彩內(nèi)容