1. 程式人生 > >Django--資料庫查詢操作

Django--資料庫查詢操作

F查詢和Q查詢:

  F查詢:

    Django中提供f()來進行兩個值之間的比較,F()可以在查詢中引用欄位來,來比較同一個model例項中的兩個不同的欄位

    示例1:查詢賣出數量大於庫存數量的商品

from django.db.models import F
ret1=models.Product.objects.filter(maichu__gt=F('kucun'))
print(ret1)

 

    F可以用來幫我們取到表中某個欄位對應的值來當作我們的篩選條件,而不是我認為自定義的常量了,實現了動態比較的效果

    Django支援F物件和F物件之間的加減乘除的取模的操作。基於此可以子啊表中的數值型別進行數學運算

    將每個商品的價格提高50塊

models.Product.objects.update(price=F('price')+50)

 

    如果修改char欄位,在後面加上新的字元,這個時候是需要使用Concat操作,並且要和憑藉值Value一起使用。

  

  Q查詢:

    filter()等方法中使用逗號隔開的條件的與的關係。如果這時候你需要執行更復雜的查詢(or...),那麼就可以使用Q物件了

    示例1:查詢賣出數量大於100或者價格少於100塊的商品:

from django.db.models import Q
models.Product.objects.filter(Q(maichu__gt=100)|Q(price__lt=100))

 

    對條件包裹一層Q的時候,filter就可以支援交叉與或並的比較符

    示例二:查詢庫存數是100並且賣出數量不是0的產品

models.Product.objects.filter(Q(kucun=100)&~Q(maichu=0))

    我們可以組合使用&和|操作符以及使用括號進行分組來編寫任意複雜的Q物件,同時Q物件可以使用~操作符進行取反, 這允許組合正常的查詢和取反(NOT)查詢

    示例三:查詢產品名包含新款,並且庫存數大於60的

models.Product.objects.filter(Q(kucun__gt=60), name__contains="新款")

    查詢函式可以混合使用Q物件和關鍵字引數。所有提供給查詢函式的引數(關鍵字引數或Q物件)都將
“AND”在一起。但是如果出現Q物件,它必須位於所有關鍵字引數的前面

    Q物件的補充:

    from django.db.models import F, Q
    q = Q()
    q.connector = 'or'  # 通過這個引數可以將Q物件預設的and關係變成or
    q.children.append(('price', 188.88))
    q.children.append(('name', '高跟鞋'))
    res = models.Product.objects.filter(q)
    print(res)

 

 

 

事務操作:

  事務的ACID:  

    原子性、一致性、隔離性、永續性

  定義:將多個sql語句操作變成原子性操作,要麼同時成功,有一個失敗則在裡面回滾都原來的狀態,保證資料的完整性和一致性(NoSQL資料庫對於事務則是部分支援)

from django.db import transaction
    with transaction.atomic():
        # 在with程式碼塊中寫事務操作
        models.Product.objects.filter(id=1).update(F('kucun') - 1, F('maichu') + 1)

 

 

 

自定義orm的欄位:

class MyCharField(models.Field):
    def __init__(self, max_length, *args, **kwargs):
        self.max_length = max_length
        super().__init__(max_length=max_length, *args, **kwargs)

    def db_type(self, connection):
        return 'char(%s)' % self.max_length


class Product(models.Model):
    info = MyCharField(max_lengh=32)

 

  

only和defer:拿到的是一個物件,兩者之間是相反的

res = models.Product.object.defer("name")
for i in res:
    print(i.name)

res = models.Product.object.only("name")
for i in res:
    print(i.name)

 

 

 

Django中的常用的欄位和引數:(https://www.cnblogs.com/Dominic-Ji/p/9203990.html)

  1、常用欄位

    AutoField:

      int自增列,必須填入引數primary_key=True。當model中如果沒有自增列,則自動會建立一個列名為id的列

    IntegerField:

      一個整數型別,範圍在 -2147483648 to 2147483647。(一般不用它來存手機號(位數也不夠),直接用字串存,)

    CharField:

      字元型別,必須提供max_length引數, max_length表示字元長度。

  Django中的CharField對應的MySQL資料庫中的varchar型別,沒有設定對應char型別的欄位,但是Django允許我們定義新的欄位,在上面已經定義了。

 

Django中的幾個比較重要的方法:(https://www.cnblogs.com/Dominic-Ji/p/9213887.html)

  update和save之間的區別:

    兩者都是對資料的修改和儲存的操作,但是save函式是將資料列的全部資料項全部重新寫了一遍,而update則是針對修改項進行鍼對的跟新,效率高而且耗時更少。所以以後要是有對資料的修改更推薦使用uodate()

  choices:

choices = ((1, '男'), (2,'女'),(3,'其他'))

gender = models.IntegerField(choices=choices, default=2)


res = models.Product.objects.filter(id=1).first()
print(res.get_gender_display())  # 可以直接查到指定資料中的性別關鍵字

 

 

  

&n