1. 程式人生 > 程式設計 >Django ORM filter() 的運用詳解

Django ORM filter() 的運用詳解

最近釋出程式碼的時候,遇到一個問題,發現Python中eval()函式的危險性.然而我還是個菜鳥,其中有一段程式碼是這樣的。

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

程式碼場景:

這是一個獲取資訊的API.所以需要去資料庫裡取對應資訊,但是你不知道獲取資訊是根據哪幾個欄位而來,需要靠使用者傳入,在這裡eval()函式就提供給某些人員很好的入侵性.所以用了另外一種方式去改良程式碼.

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

條件查詢

條件可以是:引數,字典,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,**kwargs)

於是乎,便改用了字典傳值的方式.避免了先將程式碼字串化,然後在將其程式碼化。

用**dict呼叫,dict必須是一個字典。

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

因為沒有想到用其它方式來運用orm,所以有些新奇,用字典傳值也不失為一種良好運用。

補充知識:django orm查詢中filter與get的區別

輸入引數:

get的引數只能是model中定義的哪些欄位,只支援嚴格匹配

filter的引數可以是欄位也可以是擴充套件的where查詢關鍵字,如in,like

返回值:

get返回值是一個定義的model物件

filter返回值是一個新的QuerySet物件,然後可以對QuerySet在進行查詢返回新的QuerySet物件,支援鏈式操作,QuerySet一個集合物件,可使用迭代或者遍歷,切片等,但是不等於list型別(是一個object物件集合)

異常:

get只有一條記錄返回的時候才正常,也就是說明get查詢欄位必須是主鍵或者唯一約束的欄位。當返回多條記錄或者沒有找到記錄的時候都會丟擲異常

get方法是從資料庫的取得一個匹配的結果,返回一個物件,如果記錄不存在的話,它會報錯,有多條記錄也會報錯。

filter有沒有匹配的記錄都可以

filter方法是從資料庫的取得匹配的結果,返回一個物件列表,如果記錄不存在的話,它會返回[]。

另外,從別的資料裡看到filter好像有快取資料的功能,第一次查詢資料庫並生成快取,下次再呼叫filter方法的話,直接取得快取的資料,會get方法每次執行都是直接查詢資料庫的,不知道這個是不是正確,看看就好。

以上這篇Django ORM filter() 的運用詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。