Django中查詢表的具體字段/models的具體屬性


Django是一個ORM框架,這也就使得開發者不需要寫SQL,而是通過一些封裝好的API就可以進行數據庫操作,省去了關於各種數據庫的細節問題。

get, all, filter

一直以來,在Django中通過Model進行數據庫查詢的時候用的最多的就是get、all和filter,比如

_ = ExampleModel.objects.all()

這樣得到的返回結果是一個QuerySet, 里面的元素是Model對象,而且返回的是對應的表中全部字段,類似於SQL中SELECT * FROM ......查詢。如果業務需要如此的時候這么做當然沒有問題,但是當業務不需要這么多數據的時候這么做就有兩個問題:

  1. 查詢所有字段會占用大量的內存,尤其數據庫表中數據量非常大的時候這會成為性能瓶頸
  2. 沒有直接獲取到想要的數據,需要另外寫代碼過濾數據,浪費精力,寫的代碼還不一定好
    Django本身其實提供了方法簡便地獲取具體的字段的內容。

備注:
關於這兩點其實不是絕對的,尤其是在數據量和並發都超大的場景下。
Django中Model的查詢API最終其實也是轉化成SQL來執行的,API復雜的時候也就意味的SQL復雜,這樣就等於把計算壓力從代碼所在的服務器轉嫁到了數據庫服務器上,當數據量和並發(尤其是並發)巨大的時候,數據庫服務器肯定不能承受,所以這個時候也許只能做簡單的查詢,然后通過自己寫代碼來做數據過濾和拼接


values、values_list

今天寫一個功能的時候需要查詢一個模型的一個指定的屬性的值,以前其實也有類似的情況,但是一般就直接通過all或者filter來查詢,然后自己過濾數據了,但是今天由於知道這張表以后的數據量會非常大(每分鍾會新產生大約5000-7000條數據),如果依然像之前一樣采用all或者filter就會出問題,所以就發現了values和valuies_list這兩個方法。

  • values
    values方法獲取指定屬性時需要傳入屬性名
_ = ExampleModel.objects.values('id', 'username')
# 返回的結果是QuerySet, 里面的元素是dict格式
# [{'id':1, 'username': 'Austin'}, {'id':2, 'username':'Sam'}, ...]

相當於SQL中的SELECT id, username FROM ......, 只返回對應屬性(字段)的值,

  • values_list
    與values非常像,只是返回的QuerySet中的元素是tuple格式的
_ = ExampleModel.objects.values_list('id', 'username')
# 返回的結果是QuerySet, 里面的元素是dict格式
# [(1, 'Austin'), (2, 'Sam') ...]
  • 獲取字符串格式的返回值
    當只需要獲取一個屬性的值時,可以通過制定flat=True來獲得字符串格式的返回值,這往往更符合需求
_ = ExampleModel.objects.values_list('username', flat=True)
# 獲得返回值如下:
# <QuerySet['Austin', 'Sam', ... ]>

官網鏈接: https://docs.djangoproject.com/en/3.1/ref/models/querysets/#django.db.models.query.QuerySet.values
同步發表於個人站點:http://panzhixiang.cn


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM