f/q查詢
測試表
from django.db importmodels
#create your models here.
class
mycharfield(models.field):
def__init__(self,max_length,*args,**kwargs):
self.max_length =max_length
super().
__init__(max_length=max_length,*args,**kwargs)
defdb_type(self, connection):
return
'char(%s)
'%self.max_length
class
product(models.model):
name = models.charfield(max_length=32) #
都是類例項化出來的物件
price = models.decimalfield(max_digits=8,decimal_places=2)
maichu =models.integerfield()
kucun =models.integerfield()
info = mycharfield(max_length=32,null=true) #
改欄位可以為空
choices = ((1,'
男'),(2,'
女'),(3,'其他'
)) gender = models.integerfield(choices=choices,default=2)
f查詢
res = models.product.objects.filter(maichu__gt=f('kucun'))
(res)
將所有的商品的**提高100塊
models.product.objects.update(price=f('
price
')+100)
將所有商品的名字後面都加乙個爆款
from django.db.models.functions import
concat
from django.db.models import
value
models.product.objects.update(name=concat(f('
name
'),value('爆款'
)))
q查詢
res = models.product.objects.filter(price=188.88,name='連衣裙爆款')
(res)
from django.db.models import
f, q
res = models.product.objects.filter(q(price=188.88),q(name='
連衣裙爆款
')) #
and res = models.product.objects.filter(q(price=188.88)|q(name='
連衣裙爆款
')) #
or res = models.product.objects.filter(q(price=188.88)|~q(name='
連衣裙爆款
')) #
not混合使用 需要注意的是q物件必須放在普通的過濾條件前面
res = models.product.objects.filter(~q(name='
連衣裙爆款
'),price=188.88) #
notprint
(res)
q物件補充(******)
from django.db.models import
f, q
q =q()
q.connector = 'or'
#通過這個引數可以將q物件預設的and關係變成or
price
',188.88))
'name
','高跟鞋爆款'))
res = models.product.objects.filter(q) #
q物件查詢預設也是and
print(res)
事務
事務的acid
from django.db importtransaction
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)
#寫其他**邏輯
print('
hahah
')
only 與 defer
only(『name』)返回的結果是乙個物件,它好比先從資料庫把資料的name這個字段取出來了,你可以通過句點符點出物件的name屬性,當然通過物件也可以點出物件的其他屬性,但是此時注意,因為你之前已經從資料庫
取出的name屬性,所以此時點name不需要再從資料庫查詢而是直接返回結果,但是其他的屬性則相反,需要從資料庫取出結果返回。
defer(『name』)和only一模一樣,只是返回的結果是排除了name欄位,也就是點name是要從資料庫取,其他的都不需要,因為已經取出了。
only與defer 結果拿到的是乙個物件 兩者是相反的res = models.product.objects.values('
name')
res = models.product.objects.only('
name')
res = models.product.objects.defer('
name')
for i in
res:
(i.name)
choice
首先自定義了乙個字段型別mycharfield, 在下方的class product 類中有乙個gender欄位,欄位中的choice資料比較特殊,它好比之前我們學習mysql中的列舉物件,多選一,首先提前準備選項choices,在字段內部在用choices欄位接收。
通過例項化物件點gander屬性返回的結果是乙個數字,也就是choices容器中性別對應的數字。如果需要獲取數字所表示的性別字串,可以使用 res.get_gender_display() 方法!
classmycharfield(models.field):
def__init__(self,max_length,*args,**kwargs):
self.max_length =max_length
super().
__init__(max_length=max_length,*args,**kwargs)
defdb_type(self, connection):
return
'char(%s)
'%self.max_length
class
product(models.model):
name = models.charfield(max_length=32) #
都是類例項化出來的物件
price = models.decimalfield(max_digits=8,decimal_places=2)
maichu =models.integerfield()
kucun =models.integerfield()
info = mycharfield(max_length=32,null=true) #
改欄位可以為空
choices = ((1,'
男'),(2,'
女'),(3,'其他'
)) gender = models.integerfield(choices=choices,default=2)
def__str__
(self):
return
'商品物件的名字:%s
'%self.name
res = models.product.objects.filter(id=1).first()(res.gender)
print(res.get_gender_display()) #
獲取編號對應的中文注釋
models.product.objects.create(...gender=1)
Django F查詢與Q查詢
f查詢 from django.db.models importf ret models.book.objects.filter read num gt f comment num print ret print ret.values title 結果 給全部書的 加1 models.book.ob...
Django F與Q查詢以及如何開啟事務
匯入模組 from django.db.models import f,q 資料準備 查詢賣出數大於庫存數的書籍 res models.book.objects.filter sold gt f inventory print res 將所有書籍的 提公升50models.book.objects....
Django框架F查詢與Q查詢 全面了解
一 f與q查詢 1.f查詢的作用 能夠幫助你直接獲取到列表中某個字段對應的資料 注意 在操作字串型別的資料的時候,f不能夠直接做到字串的拼接 2.查詢賣出書大於庫存數的書籍 匯入f查詢 from django.db.models import f f 將書籍 庫存字段對應的值 依序取出 並進行比較 ...