Django ORM基本用法
阿新 • • 發佈:2020-07-17
一、ORM介紹
1.ORM的概念:
"物件-關係對映"(Object/RelationalMapping)的縮寫。ORM把資料庫對映成物件,然後通過例項物件完成對關係型資料庫的操作,如下圖。
2.ORM的特點
ORM 使用了物件進行資料庫操作,開發者無需瞭解 sql 語法,只要面向物件程式設計即可,直接與資料互動,不用關心底層資料庫。
3.ORM 的優點
1)實現了面向物件程式設計,無需面向資料庫編碼。
- 對資料庫的操作(如:增、刪、改、查)轉化成 類屬性和方法
- 不用編寫各種 sql 語句
2)實現了資料模型與資料庫解耦,消除了不同資料庫編碼之間的差異。
- 不用關心資料庫是 mysql、Oracle、mssql等
- 只要更改相關配置,就能完成不同資料庫間的遷移
4.ORM 的缺點
1)對比直接使用 sql 語句查詢,效能有損失。
2)ORM 庫不是一個輕量級庫,學習成本高。
3)相對於較複雜的 sql 語句,使用 ORM 來操作很複雜,導致程式碼可讀性降低。
二、ORM 使用
1.配置資料庫
1)修改 Django 專案 setting.py ,找到 DATABASES 配置
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 資料庫引擎 'NAME': 'work', #資料庫名稱 'HOST': '127.0.0.1', # 資料庫地址,本機 ip 地址 127.0.0.1 'PORT': 3306, # 埠 'USER': 'root', # 資料庫使用者名稱 'PASSWORD': '123456', # 資料庫密碼 } }
2)修改 setting.py 同級目錄下的 __init__.py 檔案,增加如下程式碼。
import pymysql pymysql.version_info = (1,3,13,'final',0) # 一定要加上這句程式碼 pymysql.install_as_MySQLdb()
pymysql.version_info=(1,3,13,'final',0) 指定版本資訊,不然後續會報如下錯誤 mysqlclient1.3.13ornewerisrequired;youhave0.9.3
2.資料模型
1)定義 app 中的 models:例如修改 core/models.py
from django.db import models # Create your models here. class department_temp(models.Model): id = models.AutoField(primary_key=True) jobnum = models.CharField(max_length=100) department = models.CharField(max_length=100) jirakey = models.CharField(max_length=100) name = models.CharField(max_length=100) class Meta: # 必須要寫這個類 db_table = 'department_temp' # 指定表名
- 以類名 department_temp 對應資料庫表名,繼承了models.Model 類。jobnum 對應 欄位 jobnum,資料型別CharField 對應 varchar,max_length 限定長度。
- class Meta 是一個元類,通過 db_table 指定表名
2)基本操作
增
from core.models import department_temp # 增加一條資料 test = department_temp(jobnum = '00000001',department = 'test',jirakey = '02930213',name = 'test') test.save()View Code
刪
from core.models import department_temp # 刪除 test = department_temp.objects.get(jobnum = '00000001') test.delete() # 另外一種方式 # department_temp.objects.filter(jobnum = '00000001').delete() # 刪除所有的列 # department_temp.objects.all().delete()View Code
改
from core.models import department_temp # 修改其中一個欄位,再save,相當於SQL中的UPDATE test = department_temp.objects.get(jobnum = '00000001') test.name = '亞瑟' test.save() # 另外一種方式 # department_temp.objects.filter(jobnum = '00000001').update(name='李白') # 修改所有的列 # department_temp.objects.all().update(name='李白')View Code
查
from core.models import department_temp # 獲取單個物件 test =department_temp.objects.get(jobnum = '00000001') print(test.name) # filter相當於SQL中的WHERE,可設定條件過濾結果,返回一個或多個例項物件組成的QuerySets查詢集 # test = department_temp.objects.filter(jobnum = '00000001')[0] # 資料排序,返回QuerySets查詢集 # test = department_temp.objects.order_by('id')[0] # 限制返回的資料 相當於 SQL 中的 LIMIT 0,2;返回QuerySets查詢集 # test = department_temp.objects.order_by('id')[0:2] # 可以組合使用查詢條件,返回QuerySets查詢集 # test = department_temp.objects.filter(jobnum = '00000001').order_by('id') # 查詢所有,返回QuerySets查詢集 # test = department_temp.objects.all()View Code
3)進階操作
# test = department_temp.objects.filter(name='亞瑟').count() # 獲取個數 # 大於,小於 # test = department_temp.objects.filter(id__gt=1) # 獲取id大於1的值 # test = department_temp.objects.filter(id__gte=1) # 獲取id大於等於1的值 # test = department_temp.objects.filter(id__lt=10) # 獲取id小於10的值 # test = department_temp.objects.filter(id__lte=10) # 獲取id小於10的值 # test = department_temp.objects.filter(id__lt=10, id__gt=1) # 獲取id大於1 且 小於10的值 # in # test = department_temp.objects.filter(id__in=[11, 22, 33]) # 獲取id等於11、22、33的資料 # test = department_temp.objects.exclude(id__in=[11, 22, 33]) # not in # isnull # test = department_temp.objects.filter(jobnum__isnull=True) # contains # test = department_temp.objects.filter(name__contains="test") # test = department_temp.objects.filter(name__icontains="test") # icontains大小寫不敏感 # test = department_temp.objects.exclude(name__icontains="test") # range # test = department_temp.objects.filter(id__range=[1, 2]) # 範圍bettwen and # order by # test = department_temp.objects.filter(name='亞瑟').order_by('id') # asc # test = department_temp.objects.filter(name='亞瑟').order_by('-id') # desc # group by # 實現這句包含group by 的 sql: SELECT department, COUNT(id) FROM department_temp GROUP BY department # from django.db.models import Count, Min, Max, Sum # test = department_temp.objects.values('department').annotate(Count('id')) # limit 、offset # test = department_temp.objects.all()[10:20]View Code