Django F查詢Q查詢Only與Defel

2022-02-04 06:28:21 字數 4572 閱讀 1081

f/q查詢

測試表

from django.db import

models

#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'))

print

(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='

連衣裙爆款')

print

(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 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)

#寫其他**邏輯

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:

print

(i.name)

choice

首先自定義了乙個字段型別mycharfield, 在下方的class product 類中有乙個gender欄位,欄位中的choice資料比較特殊,它好比之前我們學習mysql中的列舉物件,多選一,首先提前準備選項choices,在字段內部在用choices欄位接收。

通過例項化物件點gander屬性返回的結果是乙個數字,也就是choices容器中性別對應的數字。如果需要獲取數字所表示的性別字串,可以使用  res.get_gender_display() 方法!

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)

def__str__

(self):

return

'商品物件的名字:%s

'%self.name

res = models.product.objects.filter(id=1).first()

print

(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 將書籍 庫存字段對應的值 依序取出 並進行比較 ...