咱們以前操做數據庫是經過寫sql語句,那麼能不能不寫sql語句就能夠操做數據庫呢? 固然能夠,這就要使用ORM框架了。python
O是object,也就類對象的意思,R是relation,翻譯成中文是關係,也就是關係數據庫中數據表的意思,M是mapping,是映射的意思。在ORM框架中,它幫咱們把類和數據表進行了一個映射,可讓咱們經過類和類對象就能操做它所對應的表格中的數據。ORM框架還有一個功能,它能夠根據咱們設計的類自動幫咱們生成數據庫中的表格,省去了咱們本身建表的過程。mysql
django中內嵌了ORM框架,不須要直接面向數據庫編程,而是定義模型類,經過模型類和對象完成數據表的增刪改查操做。sql
使用django進行數據庫開發有三個步驟:shell
1.在models.py中定義模型類數據庫
2.遷移django
3.經過類和對象完成數據增刪改查操做編程
下面咱們就以保存圖書信息爲例來給你們介紹Django中進行數據庫開發的整個流程。session
在booktest下的models.py中建立模型,須要繼承models.Model類:app
from django.db import models #設計和表對應的類 模型類 # Create your models here. #圖書類 class BookInfo(models.Model): '''圖書模型類''' #圖書名稱 CharField說明是一個字符串 max_length指定字符串的最大長度 btitle = models.CharField(max_length=20) #出版日期 DateField說明是一個日期類型 bpub_date = models.DateField()
遷移有兩步:框架
1.生成遷移文件:根據模型類生成建立表的遷移文件。
2.執行遷移:根據第一步生成的遷移文件在數據庫中建立表。
生成遷移文件命令以下:
python manage.py makemigrations
執行生成遷移文件命令後,會在應用booktest目錄下的migrations目錄中生成遷移文件。
咱們打開這個文件,內容以下:
# Generated by Django 3.0.2 on 2020-01-15 07:01 from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ ] operations = [ migrations.CreateModel( name='BookInfo', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('btitle', models.CharField(max_length=20)), ('bpub_date', models.DateField()), ], ), ]
Django框架根據咱們設計的模型類生成了遷移文件,在遷移文件中咱們能夠看到fields列表中每個元素跟BookInfo類屬性名以及屬性的類型是一致的。同時咱們發現多了一個id項,這一項是Django框架幫咱們自動生成的,在建立表的時候id就會做爲對應表的主鍵列,而且主鍵列自動增加。
當執行遷移命令後,Django框架會讀取遷移文件自動幫咱們在數據庫中生成對應的表格。
Django默認採用sqlite3數據庫,上圖中的db.sqlite3就是Django框架幫咱們自動生成的數據庫文件。 sqlite3是一個很小的數據庫,一般用在手機中,它跟mysql同樣,咱們也能夠經過sql語句來操做它。
可是咱們通常是使用mysql做爲案例的,因此咱們須要將模型轉爲mysql數據庫中的表。
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'bms', # 要鏈接的數據庫,鏈接前須要建立好 'USER':'root', # 鏈接數據庫的用戶名 'PASSWORD':'root', # 鏈接數據庫的密碼 'HOST':'127.0.0.1', # 鏈接主機,默認本機 'PORT':3306 # 端口 默認3306 } }
NAME即數據庫的名字,在mysql鏈接前該數據庫必須已經建立,而上面的sqlite數據庫下的db.sqlite3則是項目自動建立 USER和PASSWORD分別是數據庫的用戶名和密碼。設置完後,再啓動咱們的Django項目前,咱們須要激活咱們的mysql。而後,啓動項目,會報錯:no module named MySQLdb 。這是由於django默認你導入的驅動是MySQLdb,但是MySQLdb對於py3有很大問題,因此咱們須要的驅動是PyMySQL。因此咱們還須要找到項目名下的__init__,在裏面寫入:
import pymysql pymysql.install_as_MySQLdb()
而後咱們還要注意一個報錯,報錯以下:
django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.
MySQLclient目前只支持到python3.4,所以若是使用的更高版本的python,須要修改以下:
經過路徑查找E:\pythondaima\venv\Lib\site-packages\django\db\backends\mysql\base..py。在這個路徑下找到以下地方:
註釋掉就OK了。
還有就是上一章講過的,確保配置文件中的INSTALLED_APPS中寫入咱們建立的app名稱。
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'booktest', ]
刪除原來生成的文件,從新運行兩條命令:
python manage.py makemigrations
python manage.py migrate
咱們能夠看到生成的表名叫作booktest_bookinfo,booktest是應用的名字,bookinfo是模型類的名字。
咱們再弄個角色類:
在booktest/models.py,定義角色類:
class RoleInfo(models.Model): '''角色人物模型類''' # 角色名 rname = models.CharField(max_length=20) # 性別 rgender = models.BooleanField() # 備註 rcomment = models.CharField(max_length=100) # 關係屬性 rbook = models.ForeignKey('BookInfo',on_delete=models.CASCADE)
在外鍵值的後面加上 on_delete=models.CASCADE,由於在django2.0後,定義外鍵和一對一關係的時候須要加on_delete選項,此參數爲了不兩個表裏的數據不一致問題,否則會報錯。
這裏要說明的是,BookInfo類和RoleInfo類之間具備一對多的關係,這個一對多的關係應該定義在多的那個類,也就是RoleInfo類中。
在咱們以後遷移生成表的時候,Django框架就會自動幫咱們在圖書表和角色表之間創建一個外鍵關係。
python manage.py makemigrations
python manage.py migrate
完成數據表的遷移以後,下面就能夠經過進入項目的shell,進行簡單的API操做。若是須要退出項目,可使用ctrl+d快捷鍵或輸入quit()。
進入項目shell的命令:
python manage.py shell
首先引入booktest/models中的類:
from booktest.models import BookInfo,RoleInfo
查詢全部圖書信息:
BookInfo.objects.all()
由於當前並無數據,因此返回空列表。
新建圖書對象:
b=BookInfo() b.btitle="斗羅大陸" from datetime import date b.bpub_date=date(2008,12,14) b.save()
再次查詢全部圖書信息:
BookInfo.objects.all()
查找圖書信息並查看值:
b=BookInfo.objects.get(id=1)
b
b.id
b.btitle
b.bpub_date
修改圖書信息:
b.bpub_date=date(2017,1,1)
b.save()
b.bpub_date
刪除圖書信息:
b.delete()
對於RoleInfo能夠按照上面的方式進行增刪改查操做。
建立一個BookInfo對象
b=BookInfo() b.btitle='abc' b.bpub_date=date(2017,1,1) b.save()
建立一個RoleInfo對象
r=RoleInfo() r.rname='a1' r.rgender=False r.rcomment='he is a boy' r.rbook=b r.save()
圖書與角色是一對多的關係,django中提供了關聯的操做方式。
得到關聯集合:返回當前book對象的全部role。
b.roleinfo_set.all()