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()) # 可以直接查到指定數據中的性別關鍵字