1. 程式人生 > 其它 >【經驗分享】Django開發中常用到的資料庫操作總結

【經驗分享】Django開發中常用到的資料庫操作總結

查詢類操作

1)查詢所有的結果,相當 sql 中的 select * from
list = Test.objects.all()

2)條件查詢,filter 相關 sql 中的 where,用於過濾查詢結果
傳多個引數:result = Test.objects.filter(id=1, name=’test’)
如果多條件與查詢,直接用逗號隔開,filter函式裡面的引數都是Test Model中的欄位

3)獲取單個物件,get 方法的引數一般為 Model 的主鍵,如果找不到會報錯
test_obj = Test.objects.get(id=1)

4)限制返回的結果資料的數量,相當於 sql 中的 limit,其中 order_by 是用於排序,如果根據欄位 a 倒序排序,就是 order_by(“-time”)
Test.objects.order_by('name')[0:2]

5)鏈式查詢
Test.objects.filter(name=’test’).order_by(“-ctime”)

6)多條件引數查詢,傳字典,構造查詢條件
data = Test.objects.filter(**query_dict).order_by(“-ctime”).values
其中query_dict為一個字典,key為條件欄位,value為條件值
query_dict = {'id':123,'name':’yyp’}

7)傳 Q 物件,構造查詢條件

  • 在 filter() 等函式中關鍵字引數彼此之間都是 “and” 關係。但是要執行更復雜的查詢(比如,實現篩選條件的 or 關係),可以使用 Q 物件。
  • Q物件包括 AND 關係和 OR 關係
  • Q 物件可以用&和 | 運算子進行連線。當某個操作連線兩個 Q 物件時,就會產生一個新的等價的 Q 物件

1、第一步,構造Q物件:
fromdjango.db.models import Q
Q(name__startswith=’h’) | Q(name__startswith=’p’)

2、第二步,Q物件以查詢引數方式使用,多個Q物件是and關係:
Test.objects.filter(
Q(date=’2018-10-10 00:00:00’),
Q(name__startswith=’h’) | Q(name__startswith=’p’)

filter() 等函式可以接受 Q物件和條件引數,但Q物件必須放在條件引數前面

8)過濾不滿足條件的操作
data = Test.objects.exclude(id=1)

傳入條件查詢

q1 = Q()
q1.connector = 'OR'              #連線方式
q1.children.append(('id', 1))
q1.children.append(('id', 2))
q1.children.append(('id', 3))

models.Tb1.objects.filter(q1)

合併條件查詢

con = Q()

q1 = Q()
q1.connector = 'OR'
q1.children.append(('id', 1))
q1.children.append(('id', 2))
q1.children.append(('id', 3))

q2 = Q()
q2.connector = 'OR'
q2.children.append(('status', '線上'))

con.add(q1, 'AND')
con.add(q2, 'AND')

models.Tb1.objects.filter(con)

增加類操作

1) 新增一條記錄
test1 = Test(name=’yyp’)
test1.save()


更新類操作

1)先查詢獲取物件,再修改物件的值,再儲存
test1 = Test.objects.get(id=1)
test1.name = ‘Google’
test1.save()

2)條件鏈式更新
Test.objects.filter(id=1).update(name=‘Google’)


刪除類操作

1)先查詢獲取要刪除的物件,然後直接delete操作
// 刪除id=1的資料
test1 = Test.objects.get(id=1)
test1.delete()

2)條件刪除
Test.objects.filter(id=1).delete()

QuerySet相關

Django中model查詢出來的結構型別為QuerySet,本質是一個查詢物件集。

1)將多個查詢結果轉換為字典列表
// all()方法查詢出來的是QuerySet,用values方法轉成字典集
data= Test.objects.all().values()
data_dict_list = list(data)
<QuerySet [<Test: test>]> ----><QuerySet [{“id”:XXX, “name”:XXX}]>

2)QuerySet物件轉換成字典物件
fromdjango.forms.models import model_to_dict
data = Test.objects.get(id=1)
data_dict = model_to_dict(data)

3)序列化成json資料

對於很多web開發介面的時候,要返回的是json資料,而django從DB查詢出來的是物件集,可以考慮django-rest-framework 庫的serializers類,具體可參考:Tutorial 1: 序列化


查詢條件總結

欄位名__op:

__exact 精確等於 like ‘aaa’

__iexact精確等於忽略大小寫ilike‘aaa’

__contains 包含 like ‘%aaa%’

__icontains包含忽略大小寫ilike‘%aaa%’,但是對於sqlite來說,contains的作用效果等同於icontains。

__gt大於

__gte大於等於

__lt小於

__lte小於等於

__in 存在於一個list範圍內

__startswith以…開頭

__istartswith以…開頭忽略大小寫

__endswith以…結尾

__iendswith以…結尾,忽略大小寫

__range 在…範圍內

__year 日期欄位的年份

__month 日期欄位的月份

__day 日期欄位的日

__isnull=True/False

使用sql語句進行查詢

fromdjango.db import connection

cursor = connection.cursor()

cursor.execute(“select * from Test where name = %s”, "yyp")

row = cursor.fetchone()

本文由騰訊藍鯨智雲編輯釋出,騰訊藍鯨智雲(簡稱藍鯨)軟體體系是一套基於PaaS的技術解決方案,致力於打造行業領先的一站式自動化運維平臺。目前已經推出社群版、企業版,歡迎體驗。