Django ORM filter() 的運(yùn)用詳解
最近發(fā)布代碼的時(shí)候,遇到一個(gè)問題,發(fā)現(xiàn)Python中eval()函數(shù)的危險(xiǎn)性.然而我還是個(gè)菜鳥,其中有一段代碼是這樣的。
queryset = eval('models.TUserInfo.objects.filter({0})[{1}:{2}]'.format(select,page_num * page - page_num,page_num * page))
代碼場景:
這是一個(gè)獲取信息的API.所以需要去數(shù)據(jù)庫里取對應(yīng)信息,但是你不知道獲取信息是根據(jù)哪幾個(gè)字段而來,需要靠用戶傳入,在這里eval()函數(shù)就提供給某些人員很好的入侵性.所以用了另外一種方式去改良代碼.
filter(**kwargs): 它包含了與所給篩選條件相匹配的對象
條件查詢
條件可以是:參數(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)闆]有想到用其它方式來運(yùn)用orm,所以有些新奇,用字典傳值也不失為一種良好運(yùn)用。
補(bǔ)充知識:django orm查詢中filter與get的區(qū)別
輸入?yún)?shù):
get的參數(shù)只能是model中定義的哪些字段,只支持嚴(yán)格匹配
filter的參數(shù)可以是字段也可以是擴(kuò)展的where查詢關(guān)鍵字,如in,like
返回值:
get返回值是一個(gè)定義的model對象
filter返回值是一個(gè)新的QuerySet對象,然后可以對QuerySet在進(jìn)行查詢返回新的QuerySet對象,支持鏈?zhǔn)讲僮鳎琎uerySet一個(gè)集合對象,可使用迭代或者遍歷,切片等,但是不等于list類型(是一個(gè)object對象集合)
異常:
get只有一條記錄返回的時(shí)候才正常,也就是說明get查詢字段必須是主鍵或者唯一約束的字段。當(dāng)返回多條記錄或者沒有找到記錄的時(shí)候都會(huì)拋出異常
get方法是從數(shù)據(jù)庫的取得一個(gè)匹配的結(jié)果,返回一個(gè)對象,如果記錄不存在的話,它會(huì)報(bào)錯(cuò),有多條記錄也會(huì)報(bào)錯(cuò)。
filter有沒有匹配的記錄都可以
filter方法是從數(shù)據(jù)庫的取得匹配的結(jié)果,返回一個(gè)對象列表,如果記錄不存在的話,它會(huì)返回[]。
另外,從別的資料里看到filter好像有緩存數(shù)據(jù)的功能,第一次查詢數(shù)據(jù)庫并生成緩存,下次再調(diào)用filter方法的話,直接取得緩存的數(shù)據(jù),會(huì)get方法每次執(zhí)行都是直接查詢數(shù)據(jù)庫的,不知道這個(gè)是不是正確,看看就好。
以上這篇Django ORM filter() 的運(yùn)用詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. 詳細(xì)分析css float 屬性以及position:absolute 的區(qū)別2. ASP中格式化時(shí)間短日期補(bǔ)0變兩位長日期的方法3. ASP基礎(chǔ)知識Command對象講解4. xpath簡介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理5. 得到XML文檔大小的方法6. PHP設(shè)計(jì)模式中工廠模式深入詳解7. ASP刪除img標(biāo)簽的style屬性只保留src的正則函數(shù)8. PHP循環(huán)與分支知識點(diǎn)梳理9. html小技巧之td,div標(biāo)簽里內(nèi)容不換行10. ASP實(shí)現(xiàn)加法驗(yàn)證碼
