欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Django中Q查詢及Q()對象 F查詢及F()對象用法

 更新時間:2020年07月09日 15:22:06   作者:Coxhuang  
這篇文章主要介紹了Django中Q查詢及Q()對象 F查詢及F()對象用法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

Django Q/F

#1 環(huán)境

Python3.7.3

Django==2.0.6

#2 開始

#2.1 django F()表達(dá)式

每次獲取times當(dāng)前的值,再+1,這樣需要將times值取出,存到內(nèi)存中

obj = models.Test.objects.get(name="cox")
obj.times = obj.times + 1
obj.save()

雖然 obj.times = F(“times”) + 1

看起來像常規(guī)的Python為實例屬性賦值,但實際上它是一個描述數(shù)據(jù)庫上操作的SQL結(jié)構(gòu)

當(dāng)Django遇到要給F()實例,它會覆蓋標(biāo)準(zhǔn)的Python運算符來創(chuàng)建一個封裝的SQL表達(dá)式;在這個例子中,指示數(shù)據(jù)庫增加由 obj.times 表示的數(shù)據(jù)庫字段。

無論 obj.times 的值是或曾是什么,Python永遠(yuǎn)不需要知道–完全由數(shù)據(jù)庫來處理。Python通過Django的F()類做的所有事情僅是參考某個字段創(chuàng)建SQL語法來描述操作。

obj = models.Test.objects.get(name="cox")
obj.times = F("times") + 1
obj.save()

因此,F(xiàn)()可以通過以下方式提供性能優(yōu)勢

直接在數(shù)據(jù)庫中操作而不是python

減少一些操作所需的數(shù)據(jù)庫查詢次數(shù)

#2.2 F()操作在 obj.save() 后會持續(xù)存在

如果times的值是1,那么經(jīng)過n次save()之后,times的值是2

obj = models.Test.objects.get(name="cox")
obj.times = obj.times + 1
obj.save()
obj.save()
obj.save()

如果times的值是1,那么經(jīng)過n次save()之后,times的值是1+n,而不是2,就是因為F()操作在 obj.save() 后會持續(xù)存在

obj = models.Test.objects.get(name="cox")
obj.times = F("times") + 1
obj.save()
obj.save()
obj.save()

#2.3 F()再過濾(filter)中的使用

獲取表中收入(input_price)大于支出(output_price)的數(shù)據(jù)

models.Test.objects.filter(input_price__gt=F("output_price"))

Django支持F()對象使用加、減、乘、除、取模和冪運算等算術(shù)操作,兩個操作數(shù)可以是常數(shù)或F()對象

models.Test.objects.filter(input_price__gt=F("output_price")*2)

models.Test.objects.filter(input_price__gt=F("output_price")+F("output_price"))

你還可以在F()對象中使用雙下劃線標(biāo)記來跨越關(guān)聯(lián)關(guān)系。 帶有雙下劃線的F()對象將引入任何需要的join 操作以訪問關(guān)聯(lián)的對象

models.Test.objects.filter(authors__name=F('blog__name'))

對于date 和date/time 字段,你可以給它們加上或減去一個timedelta對象

from datetime import timedelta

models.Test.objects.filter(mod_date__gt=F('pub_date') + timedelta(days=3))

#2.4 Django Q()表達(dá)式

當(dāng)我們在查詢的條件中需要組合條件時(例如兩個條件“且”或者“或”)時。我們可以使用Q()查詢對象

from django.db.models import Q
models.Author.objects.filter(Q(name="cox") | Q(name="Tom")) # 獲取在Author表中,name等于cox和name等于cox的所有數(shù)據(jù)

models.Author.objects.filter(Q(name="cox") & Q(age=12))# 獲取在Author表中,name等于cox并且age等于12的所有數(shù)據(jù)

#2.5 Q()傳入條件查詢

q1 = Q()
q1.connector = 'OR'
q1.children.append(('name', "cox"))
q1.children.append(('name', "Tom"))
q1.children.append(('name', "Jeck"))
  
models.Author.objects.filter(q1) # 在Author表中,name等于cox/Tom/Jeck的所有數(shù)據(jù)
con = Q()

q1 = Q()
q1.connector = 'OR'
q1.children.append(('name', "cox"))
q1.children.append(('name', "Tom"))
q1.children.append(('name', "Jeck"))

q2 = Q()
q2.connector = 'OR'
q2.children.append(('age', 12))

con.add(q1, 'AND')
con.add(q2, 'AND')

models.Author.objects.filter(con) # 在Author表中,name等于cox/Tom/Jeck的 并且 滿足age等于12 的所有數(shù)據(jù)

#2.6 Q()非

在Q()語句中,~代表非

models.Author.objects.filter(~Q(name="cox")) # 獲取在Author表中,name不等于cox的所有數(shù)據(jù)

補充知識:Django 中 Models 的 F()和 Q()函數(shù)

1、F() ---- 專門取對象中某列值的操作

F對象允許Django在未實際鏈接數(shù)據(jù)的情況下具有對數(shù)據(jù)庫字段的值的引用。

通常情況下我們在更新數(shù)據(jù)時需要先從數(shù)據(jù)庫里將原數(shù)據(jù)取出后方在內(nèi)存里,然后編輯某些屬性,最后提交。

all = BookInfo.objects.filter(auth="小明")
for b in all:
  price = b.price
  b.price = price + 10
  b.save
  
# 使用F對象來計算
BookInfo.objects.filter(auth="小明").update(price=F("price")+10)

2、Q() ---- 對對象的復(fù)雜查詢

Q對象是Django對model查詢中所使用的關(guān)鍵字參數(shù)進行封裝后的一個對象。

Q對象可以通過 &(與)、 |(或)、 ~(非)運算來組合生成不同的Q對象,便于在查詢操作中靈活地運用。

from django.db.models import Q
# 并且條件:與條件查詢
models.User.objects.filter(條件1,條件2,條件n..)
models.User.objects.filter(Q(username='老王') & Q(userpass='admin'))

# 或者條件:或條件
models.User.objects.fliter(Q(username='老王') | Q(username='老李'))

# 取反條件
models.User.objects.filter(~Q(username='老王'))
models.User.objects.exclude(username='老王')

以上這篇Django中Q查詢及Q()對象 F查詢及F()對象用法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python發(fā)送http請求解析返回json的實例

    Python發(fā)送http請求解析返回json的實例

    下面小編就為大家分享一篇Python發(fā)送http請求解析返回json的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • PyTorch加載自己的數(shù)據(jù)集實例詳解

    PyTorch加載自己的數(shù)據(jù)集實例詳解

    這篇文章主要介紹了PyTorch加載自己的數(shù)據(jù)集,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • Python機器學(xué)習(xí)之決策樹和隨機森林

    Python機器學(xué)習(xí)之決策樹和隨機森林

    本文主要介紹了機器學(xué)習(xí)之決策樹和隨機森林,詳細(xì)的介紹了實現(xiàn) 原理機器實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Python條件語句與循環(huán)語句

    Python條件語句與循環(huán)語句

    這篇文章主要介紹了Python條件語句與循環(huán)語句,條件語句就是通過指定的表達(dá)式的運行結(jié)果來判斷當(dāng)前是執(zhí)行還是跳過某些指定的語句塊,循環(huán)語句就是對某些語句的重復(fù)執(zhí)行,這個重復(fù)執(zhí)行是通過指定表達(dá)式來控制的,下面來看具體內(nèi)容及續(xù)航管案例吧,需要的朋友可以參考一下
    2021-11-11
  • Python列表與元組操作技巧分享

    Python列表與元組操作技巧分享

    Python 中的列表(List)和元組(Tuple)是兩種常用的數(shù)據(jù)結(jié)構(gòu),它們都可以用來存儲一系列的元素,在本文中,我們將分享一些 Python 中列表和元組的操作技巧,幫助您更好地理解它們的用法和特性,需要的朋友可以參考下
    2024-05-05
  • pytorch實現(xiàn)CNN卷積神經(jīng)網(wǎng)絡(luò)

    pytorch實現(xiàn)CNN卷積神經(jīng)網(wǎng)絡(luò)

    這篇文章主要為大家詳細(xì)介紹了pytorch實現(xiàn)CNN卷積神經(jīng)網(wǎng)絡(luò),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • Python編寫百度貼吧的簡單爬蟲

    Python編寫百度貼吧的簡單爬蟲

    這篇文章主要介紹了Python編寫百度貼吧的簡單爬蟲,簡單實現(xiàn)了下載對應(yīng)頁碼的頁面并存為以當(dāng)前時間命名的html文件,這里分享給大家,拋磚引玉。
    2015-04-04
  • 梯度下降法介紹及利用Python實現(xiàn)的方法示例

    梯度下降法介紹及利用Python實現(xiàn)的方法示例

    梯度下降算法是一個很基本的算法,在機器學(xué)習(xí)和優(yōu)化中有著非常重要的作用,下面這篇文章主要給大家介紹了關(guān)于利用Python實現(xiàn)梯度下降法的相關(guān)資料,對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-07-07
  • Python函數(shù)命名空間和作用域(Local與Global)

    Python函數(shù)命名空間和作用域(Local與Global)

    這篇文章主要介紹了Python函數(shù)命名空間和作用域分別介紹Local與Global模式,內(nèi)容詳細(xì),具有一定的參考價值,需要的小伙伴可以參考一下
    2022-03-03
  • pandas中.loc和.iloc以及.at和.iat的區(qū)別說明

    pandas中.loc和.iloc以及.at和.iat的區(qū)別說明

    這篇文章主要介紹了pandas中.loc和.iloc以及.at和.iat的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04

最新評論