溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何運(yùn)用Django ORM filter()

發(fā)布時(shí)間:2020-07-27 11:45:39 來(lái)源:億速云 閱讀:262 作者:小豬 欄目:開(kāi)發(fā)技術(shù)

小編這次要給大家分享的是如何運(yùn)用Django ORM filter(),文章內(nèi)容豐富,感興趣的小伙伴可以來(lái)了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。

最近發(fā)布代碼的時(shí)候,遇到一個(gè)問(wèn)題,發(fā)現(xiàn)Python中eval()函數(shù)的危險(xiǎn)性.然而我還是個(gè)菜鳥(niǎo),其中有一段代碼是這樣的。

queryset = eval("models.TUserInfo.objects.filter({0})[{1}:{2}]".format(select,page_num * page - page_num,page_num * page))

代碼場(chǎng)景:

這是一個(gè)獲取信息的API.所以需要去數(shù)據(jù)庫(kù)里取對(duì)應(yīng)信息,但是你不知道獲取信息是根據(jù)哪幾個(gè)字段而來(lái),需要靠用戶傳入,在這里eval()函數(shù)就提供給某些人員很好的入侵性.所以用了另外一種方式去改良代碼.

filter(**kwargs): 它包含了與所給篩選條件相匹配的對(duì)象

條件查詢

條件可以是:參數(shù),字典,Q

  def filter(self, *args, **kwargs):
    """
    Returns a new QuerySet instance with the args ANDed to the existing
    set.
    """
    return self._filter_or_exclude(False, *args, **kwargs)

于是乎,便改用了字典傳值的方式.避免了先將代碼字符串化,然后在將其代碼化。

用**dict調(diào)用,dict必須是一個(gè)字典。

queryset = models.TUserInfo.objects.filter(**field_dict)[page_num * page - page_num:page_num * page]

因?yàn)闆](méi)有想到用其它方式來(lái)運(yùn)用orm,所以有些新奇,用字典傳值也不失為一種良好運(yùn)用。

補(bǔ)充知識(shí):django orm查詢中filter與get的區(qū)別

輸入?yún)?shù):

get的參數(shù)只能是model中定義的哪些字段,只支持嚴(yán)格匹配

filter的參數(shù)可以是字段也可以是擴(kuò)展的where查詢關(guān)鍵字,如in,like

返回值:

get返回值是一個(gè)定義的model對(duì)象

filter返回值是一個(gè)新的QuerySet對(duì)象,然后可以對(duì)QuerySet在進(jìn)行查詢返回新的QuerySet對(duì)象,支持鏈?zhǔn)讲僮?,QuerySet一個(gè)集合對(duì)象,可使用迭代或者遍歷,切片等,但是不等于list類型(是一個(gè)object對(duì)象集合)

異常:

get只有一條記錄返回的時(shí)候才正常,也就是說(shuō)明get查詢字段必須是主鍵或者唯一約束的字段。當(dāng)返回多條記錄或者沒(méi)有找到記錄的時(shí)候都會(huì)拋出異常

get方法是從數(shù)據(jù)庫(kù)的取得一個(gè)匹配的結(jié)果,返回一個(gè)對(duì)象,如果記錄不存在的話,它會(huì)報(bào)錯(cuò),有多條記錄也會(huì)報(bào)錯(cuò)。

filter有沒(méi)有匹配的記錄都可以

filter方法是從數(shù)據(jù)庫(kù)的取得匹配的結(jié)果,返回一個(gè)對(duì)象列表,如果記錄不存在的話,它會(huì)返回[]。

另外,從別的資料里看到filter好像有緩存數(shù)據(jù)的功能,第一次查詢數(shù)據(jù)庫(kù)并生成緩存,下次再調(diào)用filter方法的話,直接取得緩存的數(shù)據(jù),會(huì)get方法每次執(zhí)行都是直接查詢數(shù)據(jù)庫(kù)的,不知道這個(gè)是不是正確,看看就好。

看完這篇關(guān)于如何運(yùn)用Django ORM filter()的文章,如果覺(jué)得文章內(nèi)容寫(xiě)得不錯(cuò)的話,可以把它分享出去給更多人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI