django_filter的values / values_list

来源:https://www.cnblogs.com/zmdComeOn/archive/2020/01/09/12173444.html
-Advertisement-
Play Games

from django.db import models class Blog(models.Model): name = models.CharField(max_length=100) tagline = models.TextField() def __str__(self): # __uni ...


from django.db import models

class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

    def __str__(self):              # __unicode__ on Python 2
        return self.name

class Author(models.Model):
    name = models.CharField(max_length=50)
    email = models.EmailField()

    def __str__(self):              # __unicode__ on Python 2
        return self.name

class Entry(models.Model):
    blog = models.ForeignKey(Blog)
    headline = models.CharField(max_length=255)
    body_text = models.TextField()
    pub_date = models.DateField()
    mod_date = models.DateField()
    authors = models.ManyToManyField(Author)
    n_comments = models.IntegerField()
    n_pingbacks = models.IntegerField()
    rating = models.IntegerField()

    def __str__(self):              # __unicode__ on Python 2
        return self.headline

values

values(*fields)
返回一個ValuesQuerySet —— QuerySet 的一個子類,迭代時返回字典而不是模型實例對象。

每個字典表示一個對象,鍵對應於模型對象的屬性名稱。

下麵的例子將values() 與普通的模型對象進行比較:

# This list contains a Blog object.
>>> Blog.objects.filter(name__startswith='Beatles')
[<Blog: Beatles Blog>]

# This list contains a dictionary.
>>> Blog.objects.filter(name__startswith='Beatles').values()
[{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}]

values() 接收可選的位置參數*fields,它指定SELECT 應該限制哪些欄位。如果指定欄位,每個字典將只包含指定的欄位的鍵/值。如果沒有指定欄位,每個字典將包含資料庫表中所有欄位的鍵和值。

例如:

>>> Blog.objects.values()
[{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}],
>>> Blog.objects.values('id', 'name')
[{'id': 1, 'name': 'Beatles Blog'}]

值得註意的幾點:
如果你有一個欄位foo 是一個ForeignKey,預設的values() 調用返回的字典將有一個叫做foo_id 的鍵,因為這是保存實際的值的那個隱藏的模型屬性的名稱(foo 屬性引用關聯的模型)。當你調用values() 並傳遞欄位的名稱,傳遞foofoo_id 都可以,得到的結果是相同的(字典的鍵會與你傳遞的欄位名匹配)。

例如:

>>> Entry.objects.values()
[{'blog_id': 1, 'headline': 'First Entry', ...}, ...]

>>> Entry.objects.values('blog')
[{'blog': 1}, ...]

>>> Entry.objects.values('blog_id')
[{'blog_id': 1}, ...]
  • 當values() 與distinct() 一起使用時,註意排序可能影響最終的結果。詳細信息參見distinct() 中的備註。

  • 如果values() 子句位於extra() 調用之後,extra() 中的select 參數定義的欄位必須顯式包含在values() 調用中。values() 調用後面的extra() 調用將忽略選擇的額外的欄位。

  • 在values() 之後調用only() 和defer() 不太合理,所以將引發一個NotImplementedError。

New in Django 1.7:
新增最後一點。以前,在values() 之後調用only() 和defer() 是允許的,但是它要麼會崩潰要麼返回錯誤的結果。

ValuesQuerySet 用於你知道你只需要欄位的一小部分,而不需要用到模型實例對象的函數。只選擇用到的欄位當然更高效。

最後,要註意ValuesQuerySetQuerySet 的子類,它實現了大部分相同的方法。你可以對它調用filter()order_by() 等等。這表示下麵的兩個調用完全相同:

Blog.objects.values().order_by('id')
Blog.objects.order_by('id').values()

Django 的作者喜歡將影響SQL 的方法放在前面,然後放置影響輸出的方法(例如values()),但是實際上無所謂。這是賣弄你個性的好機會。

你可以通過OneToOneField、ForeignKey 和 ManyToManyField 屬性反向引用關聯的模型的欄位:

Blog.objects.values('name', 'entry__headline')
[{'name': 'My blog', 'entry__headline': 'An entry'},
     {'name': 'My blog', 'entry__headline': 'Another entry'}, ...]

警告

因為ManyToManyField 欄位和反向關聯可能有多個關聯的行,包含它們可能導致結果集的倍數放大。如果你在values() 查詢中包含多個這樣的欄位將更加明顯,這種情況下將返回所有可能的組合。

values_list

values_list(*fields, flat=False)
與values() 類似,只是在迭代時返回的是元組而不是字典。每個元組包含傳遞給values_list() 調用的欄位的值 —— 所以第一個元素為第一個欄位,以此類推。例如:

>>> Entry.objects.values_list('id', 'headline')
[(1, 'First entry'), ...]

如果只傳遞一個欄位,你還可以傳遞flat 參數。如果為True,它表示返回的結果為單個值而不是元組。一個例子會讓它們的區別更加清晰:

>>> Entry.objects.values_list('id').order_by('id')
[(1,), (2,), (3,), ...]

>>> Entry.objects.values_list('id', flat=True).order_by('id')
[1, 2, 3, ...]

如果有多個欄位,傳遞flat 將發生錯誤。

如果你不傳遞任何值給values_list(),它將按照欄位在模型中定義的順序, 返回模型中的所有欄位。

註意,這個方法返回ValuesListQuerySet。這個類的行為類似列表。大部分時候它足夠用了,但是如果你需要一個真實的Python 列表對象,可以對它調用list(),這將會對查詢集求值。

例如:

School.objects.filter(school_id=1).values_list("id", "flat = true")

上述orm解釋:

查找School表中school_id為1的id,這將返回一個id列表,而不是單個id元組列表。

差異巨大,values_list速度更快。flat = true使得它更快,因為python不需要實例化列表中的所有對象,只返回資料庫值。

為了證明它更快,因為Django認識到我們使用查詢集作為查詢集的參數,因此它將它們組合到一個查詢中 - 它不會首先將查詢集計算values_list為列表
有一點需要註意的是,列表理解中values / values_list的行為有所不同:

  • values / values_list將產生存儲在該欄位中的實際值,即,僅僅是id(不是整個對象)
  • 如果該值是一個外鍵,並且在模型中設置了適當的關係,則列表理解將為您提供外鍵引用的對象
class Building(models.Model):  
    corporation = models.ForeignKey('company.Corporation', verbose_name=u'學校', related_name='buildings')  
    number = models.CharField(u'樓棟編號', max_length=10, unique=True, db_index=True)  
    create_time = models.DateTimeField(u'創建時間', auto_now_add=True)  

獲取Building的number欄位列表

In [1]: from apps.dormitory.models import Building  
  
In [2]: buildings = Building.objects.values('number')  
  
In [3]: buildings  
Out[3]: [{'number': u'1'}, {'number': u'2'}, {'number': u'3'}, {'number': u'4'}, {'number': u'5'}]  
  
In [4]: buildings_ = Building.objects.values_list('number')  
  
In [5]: buildings_  
Out[5]: [(u'1',), (u'2',), (u'3',), (u'4',), (u'5',)]  
  
In [6]: buildings_list = Building.objects.values_list('number', flat=True)  
  
In [7]: buildings_list  
Out[7]: [u'1', u'2', u'3', u'4', u'5']  

從以上代碼可以看出:

values方法可以獲取number欄位的字典列表。

values_list可以獲取number的元組列表。

values_list方法加個參數flat=True可以獲取number的值列表。




鏈接:https://www.jianshu.com/p/7c7645674ae0


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Python真的是無所不能,原因就是因為Python有數目龐大的庫,無數的現成的輪子,讓你做很多很多應用都非常方便。wifi跟我們的生活息息相關,無處不在。今天從WiFi連接的原理,再結合代碼為大家詳細的介紹如何利用python來破解WiFi。、 ! 01.如何連接wifi 首先我們的電腦是如何連接 ...
  • 一、Spring IoC容器概述 1.依賴反轉(依賴註入):依賴對象的獲得被反轉了。 如果合作對象的引用或依賴關係的管理由具體對象來完成,會導致代碼的高度耦合和可測試性的降低,這對複雜的面向對象系統的設計是非常不利的。 在Spring中,IoC容器是實現依賴控制反轉這個模式的載體,它可以在對象生成或 ...
  • 一、概述 從前面 "文章" 中我們可以瞭解到,javac 的三個步驟中,程式員唯一能幹預的就是註解處理器部分,註解處理器類似於編譯器的插件,在這些插件裡面,可以讀取、修改、添加抽象語法樹中的任意元素。因此,只要有足夠的創意,程式員可以通過自定義插入式註解處理器來實現許多原本只能在編碼中完成的事情。我 ...
  • Java中IO的模型分為三種,同步阻塞的BIO、同步非阻塞的NIO、非同步非阻塞的AIO。 BIO【同步阻塞】 在JDK1.4出來之前,我們建立網路連接的時候採用BIO模式,需要先在服務端啟動一個ServerSocket,然後在客戶端啟動Socket來對服務端進行通信,預設情況下服務端需要對每個請求建 ...
  • django的model欄位在保存的時候做預處理怎麼辦? 比如這個model: class Book(Model): publish_date = DateField() 但是在保存時,用戶輸入數據是: book1 = Book(publish_date='20171001') 我希望這個publi ...
  • 簡單寫一下多對多查詢model 不是多對多的欄位我就沒寫上來的 class Tag(models.Model): name = models.CharField(max_length=20,verbose_name='標簽') add_time = models.DateField(default= ...
  • PHP+InfiniteScroll實現網頁無限滾動載入數據實例,實現原理:當滾動條到底離網頁底部一定長度的時候,向後臺發送頁數並獲取數據。 ...
  • """ 返回查詢集的方法稱為過濾器 all() 返回查詢集中所有數據 filter() 返回符合條件的數據 一、filter(鍵=值) 二、filter(鍵=值,鍵=值) #兩個關係為and 三、filter(鍵=值).filter(鍵=值) #兩個關係為and exclude()過濾掉符合邏輯的數 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...