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