天天看點

django orm原理_Django ORM詳解

Django ORM詳解

什麼是ORM?

ORM,即Object-Relational Mapping(對象關系映射),它的作用是在關系型資料庫和業務實體對象之間作一個映射,這樣,我們在具體的操作業務對象的時候,就不需要再去和複雜的SQL語句打交道,隻需簡單的操作對象的屬性和方法。

圖解:

django orm原理_Django ORM詳解

ORM圖解

相信學過linux運維,或者做運維的小夥伴都知道,在linux系統中有一個叫做 VFS(虛拟檔案系統)的東西,VFS 是幹什麼用的呢? VFS就是為不同的檔案系統提供了一個統一的操作界面和應用程式設計接口。我個人覺得這裡的ORM類似于VFS,至少處理問題的方式是類似的。

ORM中操作資料庫

本質上來說ORM操作資料庫也不過是進行CRUD的操作。隻是在ORM中将原生的SQL語句都封裝成了方法或者函數,友善我們快捷調用。下面來詳細介紹這些方法或函數:

1)模型成員objects

Django預設通過模型的objects對象實作模型資料查詢

2)資料查詢和過濾

過濾實際上就相當于SQL語句中的where語句,和過濾相關的方法或函數如下:

all() : 傳回所有的資料,得到的是一個清單

filter() :傳回複合條件的資料,條件可以有多個,多個條件用 ',' 隔開,得到的結果也是一個清單

exclude() :過濾掉符合條件的資料,傳回一個清單

order_by() : 按照指定字段進行排序

values() : 每條資料都作為一個字典,放在一個清單中

get() : 也可以接受多個條件,與 filter 不同,這裡傳回的是一個滿足條件的對象,為單個值,且如果沒有符合條件的就會報MultiObjectReturned錯誤,而 filter 不會報錯,而是傳回一個空清單。

first():傳回查詢結果中的第一個對象

last():傳回查詢結果中的最後一個對象

count():傳回目前查詢結果中的對象個數

exists():判斷查詢結果中是否有資料,如果有資料傳回True,沒有傳回False

限制查詢結果的條數

限制結果的條數,類似于SQL中的limit和offset。在ORM中則是使用下标的方式去限制,這裡有點類似于 python 中清單的下标運算,隻是這裡的下标不能為負數。

如:模型名.objects.all()[0:5]

4)ORM中的模糊查詢

startswith : 比對開始字元串

endswith : 比對結束字元串

contains : 比對包含該字元串的項

示例:

查詢姓王的資料

stus = Student.objects.filter(stu_name__startswith='王')

查詢以什麼結束的資料:

stus = Student.objects.filter(stu_name__endswith='胖')

查詢姓名中包含大的資料

stus = Student.objects.filter(stu_name__contains='大')

5)ORM中的比較運算符

isnull,isnotnull:是否為空。

如:filter(stu_name__isnull=True)

in:是否包含在範圍内。這個類似python中的in

如:filter(id__in=[1,2,3])

gt,gte,lt,lte:大于,大于等于,小于,小于等于。

如:filter(age__gt=10)

pk:代表主鍵,也就是id。

6)聚合函數

與SQL中的聚合函數一樣,隻是ORM中藥通過ggregate()函數獲得聚合函數的傳回值。

Avg:求平均值

Count:求次數

Max:求最大值

Min:求最小值

Sum:求和

例如: Student.objects.aggregate(Max('age'))

7)F對象和Q對象

導入F對象和Q對象: from django.db.models import F, Q

F對象:使用在模型的A屬性與B屬性進行比較的時候,比如要比較一個學生的A成績和B成績的時候就需要用到F對象。

例如:查找國文成績比數學成績至少高10分的學生:

stus = Student.objects.filter(stu_yuwen__gte=F('stu_shuxue') + 10)

Q對象:是為了将過濾條件組合起來查詢,在查詢的條件中需要組合條件 “且(&)” 或者 “或( | )” 時。我們需要使用Q()查詢對象。

例如:查詢學生姓名不叫王大錘的,或者國文成績大于80分的學生

stus = Student.objects.filter(~Q(stu_name='王大錘') | Q(stu_yuwen__gt=80))

注意:Q()對象的前面使用字元“~”來代表意義“非”

模型字段定義

定義屬性時,需要字段類型,字段類型被定義在django.db.models.fields目錄下,為了友善使用,被導入到django.db.models中,是以在定義屬性時要導入庫,并通過models去定義屬性。

導入庫:APP目錄下的models.py檔案中

from django.db import models

定義屬性:

class Student(models.Model):

stu_name = models.CharField(max_length=10)

屬性命名規則

遵循辨別符規則(不使用python預定義的辨別符号,内置函數名,異常等。避免使用下劃線等)

由于django的查詢方式,不允許使用連續的下劃線

字段類型

AutoField() : 一個根據實際ID自動增長的IntegerField,通常不指定如果不指定,一個主鍵字段将自動添加到模型中.

CharField(max_length=字元長度,....) : 字元串,預設的表單樣式是 TextInput.

TextField() : 大文本字段,一般超過4000使用,預設的表單控件是Textarea.

IntegerField() : 整數

DecimalField(max_digits=None, decimal_places=None) : 使用python的Decimal執行個體表示的十進制浮點數, max_digits 指定總位數,decimal_places 指定小數點後保留幾位。

FloatField() : 用Python的float執行個體來表示的浮點數.

BooleanField() : true/false 字段,此字段的預設表單控制是CheckboxInput.

NullBooleanField() : 支援null、true、false三種值.

DateField([auto_now=False, auto_now_add=False]) : 使用Python的datetime.date執行個體表示的日期 auto_now 每次儲存對象時,自動設定該字段為目前時間,用于"最後一次修改"的時間戳,它總是使用目前日期,預設為false。 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,則該字段在資料庫中是空資料,預設值是 False

blank : 如果為True,則該字段允許為空白,預設值是 False

注意: null 是資料庫範疇的概念,blank 是表單驗證證範疇的

db_column : 字段的名稱,如果未指定,則使用屬性的名稱

db_index : 若值為 True, 則在表中會為此字段建立索引

default : 預設值

primary_key : 若為 True, 則該字段會成為模型的主鍵字段

django會為表增加自動增長的主鍵列(ID),每個模型隻能有一個主鍵列,如果使用選項設定某屬性為主鍵列後,則django不會再生成預設的主鍵列。

unique : 如果為 True, 這個字段在表中必須有唯一值

補充

邏輯删除

對公司來說最重要的就是資料,删除資料的操作都是不可恢複的。是以在實際開發可能會對不需要的書進行删除,這種情況我們通常都是對資料做邏輯删除,不做實體删除,防止删除資料後,某些時候又需要該資料不能找回。那麼什麼是邏輯删除呢?邏輯删除就是在資料表中建立一個字段,這個字段通常是BooleanField,用True表示該資料有效,用False表示該資料無效被删除了。