亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何運用Django ORM filter()

發布時間:2020-07-27 11:45:39 來源:億速云 閱讀:264 作者:小豬 欄目:開發技術

小編這次要給大家分享的是如何運用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, *args, **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()的文章,如果覺得文章內容寫得不錯的話,可以把它分享出去給更多人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

仁布县| 团风县| 郓城县| 岱山县| 秭归县| 恩平市| 广饶县| 灯塔市| 故城县| 顺平县| 北京市| 永平县| 赣州市| 张家口市| 西青区| 城固县| 西峡县| 岳西县| 德惠市| 乌鲁木齐市| 白沙| 东平县| 新绛县| 宁都县| 枝江市| 工布江达县| 花莲市| 锡林郭勒盟| 漯河市| 民县| 永定县| 邵东县| 洪湖市| 封丘县| 繁昌县| 策勒县| 华坪县| 登封市| 嘉兴市| 万荣县| 若羌县|