內容目錄
1、F、Q查詢
2、事務
3、only與defer
1、F、Q查詢
"""
Product表中的數據:
1 橡皮 2 2000 3000
2 鉛筆 3 12 200
3 華爲保時捷 18000 30 23
4 索尼A6000 3680 24 12
"""
# 查詢賣出數大於50的商品
# res = models.Product.objects.filter(maichu__gt=50)
# <QuerySet [<Product: 商品對象的名字:橡皮>]>
1. F查詢
當想讓兩個字段進行比較的時候,就須要Django的F()來實現。
(1)先導入F、Q
from django.db.models import F,Q
(2)查詢賣出數大於庫存數的商品
res = models.Product.objects.filter(maichu__gt=F('kucun'))
# <QuerySet [<Product: 商品對象的名字:華爲保時捷>, <Product: 商品對象的名字:索尼A6000>]>
(3)將全部的商品的價格提升100塊
models.Product.objects.update(price=F('price')+100)
"""
修改完價格以後的表數據:
1 橡皮 102 2000 3000
2 鉛筆 103 12 200
3 華爲保時捷 18100 30 23
4 索尼A6000 3780 24 12
"""
(4)將全部商品的名字後面都加上:'特供'
from django.db.models.functions import Concat
from django.db.models import Value
models.Product.objects.update(name=Concat(F('name'), Value('特供')))
解釋:單純的使用 name=F('price')+'特供' 是行不通的,還得
"""
修改以後的數據:
1 橡皮特供 102 2000 3000
2 鉛筆特供 103 12 200
3 華爲保時捷特供 18100 30 23
4 索尼A6000特供 3780 24 12
"""
2. Q查詢
(1)res = models.Product.objects.filter(price=102)
# <QuerySet [<Product: 商品對象的名字:橡皮特供>]>
(2)res = models.Product.objects.filter(Q(price=103), Q(name='橡皮特供')) # and
# <QuerySet []>
(3)res = models.Product.objects.filter(Q(price=103) | Q(name='橡皮特供')) # or
# <QuerySet [<Product: 商品對象的名字:橡皮特供>, <Product: 商品對象的名字:鉛筆特供>]>
(4)兩者混合使用 須要注意的是Q對象必須放在普通的過濾條件前面
res = models.Product.objects.filter(~Q(name='橡皮特供'), price=103)
# <QuerySet [<Product: 商品對象的名字:鉛筆特供>]> 非橡皮特供,且價格爲103的商品
# 當要查詢的條件是用戶輸入進來的時候,能夠動態的添加
q = Q()
q.connector = 'or' # 經過這個參數能夠將Q對象默認的and關係變成or
q.children.append(('price', 102))
q.children.append(('name', '橡皮特供'))
res = models.Product.objects.filter(q) # Q對象查詢默認也是and
# <QuerySet [<Product: 商品對象的名字:橡皮特供>]>
2、事務
(1)事務的ACID
"""
原子性
一致性
隔離性
持久性
"""
(2) 代碼實現:
from django.db import transaction
from django.db.models import F
with transaction.atomic():
# 在with代碼塊兒寫你的事務操做
models.Product.objects.filter(id=1).update(kucun=F('kucun')-1)
models.Product.objects.filter(id=1).update(maichu=F('maichu')+1)
# 寫其餘代碼邏輯
3、only與defer
1.做爲參照的例子
res = models.Product.objects.values('name')
<QuerySet [{'name': '橡皮特供'}, {'name': '鉛筆特供'}, {'name': '華爲保時捷特供'}, {'name': '索尼A6000特供'}]>
2.only和defer,查詢拿到的都是對象,可是二者是相反的
res = models.Product.objects.only('name')
res = models.Product.objects.defer('name')
for i in res:
print(i.name)
(1)從執行結果來看,都會出現下面的查詢結果,區別在於,only 執行的SQL語句,只會將指定字段的數據取出來,defer則是取出除指定的字段的其餘全部數據,
(2)可是呢,取出的對象,仍是能夠點出相應字段的屬性,他是會去執行相應的SQL語句,再次去數據庫中查詢數據。
(3)上面代碼執行的結果以下(結果相同):
# <QuerySet [<Product: 商品對象的名字:橡皮特供>, <Product: 商品對象的名字:鉛筆特供>, <Product: 商品對象的名字:華爲保時捷特供>, <Product: 商品對象的名字:索尼A6000特供>]>