Django ORM 之F、Q查詢與事務

Django ORM 之F、Q查詢與事務

 

返回主菜單Django框架 【目錄】

內容目錄

  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特供>]>
相關文章
相關標籤/搜索