django_filter的values / values_list

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() 接收可選的位置參數(shù)*fields袱吆,它指定SELECT 應該限制哪些字段巧颈。如果指定字段,每個字典將只包含指定的字段的鍵/值兜粘。如果沒有指定字段申窘,每個字典將包含數(shù)據(jù)庫表中所有字段的鍵和值。

例如:

>>> 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() 調(diào)用返回的字典將有一個叫做foo_id 的鍵剃法,因為這是保存實際的值的那個隱藏的模型屬性的名稱(foo 屬性引用關聯(lián)的模型)。當你調(diào)用values() 并傳遞字段的名稱路鹰,傳遞foofoo_id 都可以贷洲,得到的結(jié)果是相同的(字典的鍵會與你傳遞的字段名匹配)。

例如:

>>> 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() 一起使用時晋柱,注意排序可能影響最終的結(jié)果优构。詳細信息參見distinct() 中的備注。

  • 如果values() 子句位于extra() 調(diào)用之后雁竞,extra() 中的select 參數(shù)定義的字段必須顯式包含在values() 調(diào)用中钦椭。values() 調(diào)用后面的extra() 調(diào)用將忽略選擇的額外的字段。

  • 在values() 之后調(diào)用only() 和defer() 不太合理碑诉,所以將引發(fā)一個NotImplementedError彪腔。

New in Django 1.7:
新增最后一點。以前进栽,在values() 之后調(diào)用only() 和defer() 是允許的德挣,但是它要么會崩潰要么返回錯誤的結(jié)果。

ValuesQuerySet 用于你知道你只需要字段的一小部分快毛,而不需要用到模型實例對象的函數(shù)格嗅。只選擇用到的字段當然更高效。

最后唠帝,要注意ValuesQuerySetQuerySet 的子類屯掖,它實現(xiàn)了大部分相同的方法。你可以對它調(diào)用filter()没隘、order_by() 等等懂扼。這表示下面的兩個調(diào)用完全相同:

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

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

你可以通過OneToOneField瑰妄、ForeignKey 和 ManyToManyField 屬性反向引用關聯(lián)的模型的字段:

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

警告

因為ManyToManyField 字段和反向關聯(lián)可能有多個關聯(lián)的行陷嘴,包含它們可能導致結(jié)果集的倍數(shù)放大。如果你在values() 查詢中包含多個這樣的字段將更加明顯间坐,這種情況下將返回所有可能的組合灾挨。

values_list

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

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

如果只傳遞一個字段,你還可以傳遞flat 參數(shù)秒拔。如果為True莫矗,它表示返回的結(jié)果為單個值而不是元組。一個例子會讓它們的區(qū)別更加清晰:

>>> 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 將發(fā)生錯誤作谚。

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

注意妹懒,這個方法返回ValuesListQuerySet。這個類的行為類似列表双吆。大部分時候它足夠用了眨唬,但是如果你需要一個真實的Python 列表對象,可以對它調(diào)用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不需要實例化列表中的所有對象苔巨,只返回數(shù)據(jù)庫值版扩。

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

  • values / values_list將產(chǎn)生存儲在該字段中的實際值,即悼尾,僅僅是id(不是整個對象)
  • 如果該值是一個外鍵柿扣,并且在模型中設置了適當?shù)年P系,則列表理解將為您提供外鍵引用的對象
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'創(chuàng)建時間', 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方法加個參數(shù)flat=True可以獲取number的值列表。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末析桥,一起剝皮案震驚了整個濱河市司草,隨后出現(xiàn)的幾起案子艰垂,更是在濱河造成了極大的恐慌,老刑警劉巖埋虹,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猜憎,死亡現(xiàn)場離奇詭異,居然都是意外死亡搔课,警方通過查閱死者的電腦和手機拉宗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辣辫,“玉大人旦事,你說我怎么就攤上這事〖泵穑” “怎么了姐浮?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長葬馋。 經(jīng)常有香客問我卖鲤,道長,這世上最難降的妖魔是什么畴嘶? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任蛋逾,我火速辦了婚禮,結(jié)果婚禮上窗悯,老公的妹妹穿的比我還像新娘区匣。我一直安慰自己,他們只是感情好蒋院,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布亏钩。 她就那樣靜靜地躺著,像睡著了一般欺旧。 火紅的嫁衣襯著肌膚如雪姑丑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天辞友,我揣著相機與錄音栅哀,去河邊找鬼。 笑死称龙,一個胖子當著我的面吹牛留拾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播茵瀑,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼间驮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了马昨?” 一聲冷哼從身側(cè)響起竞帽,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤扛施,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后屹篓,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疙渣,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年堆巧,在試婚紗的時候發(fā)現(xiàn)自己被綠了妄荔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡谍肤,死狀恐怖啦租,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情荒揣,我是刑警寧澤篷角,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站系任,受9級特大地震影響恳蹲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜俩滥,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一嘉蕾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧霜旧,春花似錦错忱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至棱貌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間箕肃,已是汗流浹背婚脱。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留勺像,地道東北人障贸。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像吟宦,于是被迫代替她去往敵國和親篮洁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理殃姓,服務發(fā)現(xiàn)袁波,斷路器瓦阐,智...
    卡卡羅2017閱讀 134,662評論 18 139
  • 原文:https://my.oschina.net/liuyuantao/blog/751438 查詢集API 參...
    陽光小鎮(zhèn)少爺閱讀 3,826評論 0 8
  • 一點點四季春珍波椰 初夏突如其來的雨 老化斷掉的衣架 看完吳宗恩的視頻好喜歡拍照 嘻,開心
    婉Qiiiing閱讀 130評論 0 0
  • 芭衽啤睡蟋!身在遠方的人啊枷颊!你們知道嗎戳杀? 我們不一樣,雖然在同一只船上 拼命地搖槳 想著:有一天 一條大船與小船相遇 隨著...
    冥夜行者閱讀 228評論 0 2
  • 直到昨天,才明白 愛情太滿题造,才無法自拔 你走之后 我就像在空中無法駐足的氣球 隨風游蕩 不知終點是在何方
    舊舊故里草木深深深丶閱讀 142評論 0 0