""" 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: 商品對象的名字:橡皮>]>
當想讓兩個字段進行比較的時候,就須要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 """
(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: 商品對象的名字:橡皮特供>]>
(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) # 寫其餘代碼邏輯
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特供>]>