對查詢集排序和查詢集的字段查找條件輸入

對查詢到的結果排序

方式1:使用order_by方法

  • 根據(jù)模型本身的字段排序
    Entry.objects.filter(pub_date__year=2005).order_by('-pub_date', 'headline')
    #排序規(guī)則是兩個,它的排序意思是先按照pub_date排序,如果pub_date有相同的記錄,就按照headline來排序這些相同的記錄
    
    #上面的結果將按照pub_date 降序排序苟鸯,然后再按照headline 升序排序山孔。
    #"-pub_date" 前面的負號表示降序排序糠馆。隱式的是升序排序娄涩。
  • 若要隨機排序嘲驾,請使用"?",像這樣:

    Entry.objects.order_by('?')

  • 如果想要根據(jù)關聯(lián)的別的模型字段進行排序
    使用字段的名稱后面跟上兩個下劃線(__)诵盼,再跟上新模型中的字段的名稱惠豺,直至你希望連接的模型银还。
    例:

    比如你有一個模型Entry,里面有一個外鍵字段blog關聯(lián)到Blog模型類,你想在查詢Entry的時候按照Blog下的name排序

    Entry.objects.order_by('blog__name')
    --根據(jù)別的模型字段排序的時候,如果沒有指定字段,則采用默認的元類設置的排序規(guī)則
    --如果關聯(lián)的模型也沒有設置元類排序規(guī)則,那么就會根據(jù)關聯(lián)的模型主鍵進行排序
    例:
    如果Blog模型類設置了默認的排序規(guī)則ordering=["name"]
    那么上面的排序可以寫成下面這樣
    Entry.objects.order_by('blog') 因為元類設置了默認的name排序,所以你指定按照Blog模型排序就是采用默認元類設置的方式
    如果元類沒有設置ordering=["name"]
    那么Entry.objects.order_by('blog')默認是按照Blog模型類的主鍵id進行排序的,等同于Entry.objects.order_by('blog__id')
    所以如果元類設置的排序規(guī)則和你想要的規(guī)則不符合,或者根本沒有設置元類排序規(guī)則,
    那么就應該像Entry.objects.order_by('blog__name')這樣指定排序字段

方式2:定義默認的排序方式

在創(chuàng)建模型類的時候在元類選項里面加入排序規(guī)則
    class Meta:
        ordering = ["horn_length"]

對排序好的結果設置升序還是降序規(guī)則

調用asc()或者desc()方法

Entry.objects.order_by(Coalesce('summary', 'headline').desc())   最后會降序排序
Coalesce方法返回不為空的字段,可以理解為如果summary字段存在,就按照summary字段排序
如果summary字段不存在,就按照headline排序

判斷返回查詢集是否是排序過的查詢集

使用ordered方法

如果QuerySet 是排好序的則返回True ,否則返回False

查詢實例方法之filter方法,返回實例集合

返回一個新的QuerySet,包含與給定的查詢參數(shù)匹配的對象洁墙。

查找的參數(shù)(**kwargs)應該滿足本文字段查找中寫的格式见剩。在底層的SQL 語句中,多個參數(shù)通過AND 連接扫俺。

如果要使用復雜的查詢,比如or查詢,需要使用Q對象

查詢實例中的字段方法返回字段值集合

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

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

values_list方法加個參數(shù)flat=True可以獲取number的值列表狼纬。

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)
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']

字段查找

字段查找里面寫的方法適用于filter(),exclude(),get()方法

  • exact 精確匹配

    Examples:
    Entry.objects.get(id__exact=14)
    Entry.objects.get(id__exact=None)

    SQL equivalents:
    SELECT ... WHERE id = 14;
    SELECT ... WHERE id IS NULL;

  • iexact不區(qū)分大小寫的精確匹配

    Example:
    Blog.objects.get(name__iexact='beatles blog')
    Blog.objects.get(name__iexact=None)
    SQL equivalents:
    SELECT ... WHERE name ILIKE 'beatles blog';
    SELECT ... WHERE name IS NULL;

    請注意,第一個查詢將匹配 'Beatles Blog', 'beatles blog', 'BeAtLes BLoG'

  • contains 區(qū)分大小寫的包含匹配

    Example:
    Entry.objects.get(headline__contains='Lennon')
    SQL equivalent:
    SELECT ... WHERE headline LIKE '%Lennon%';
    'Lennon honored today'會被匹配,但'lennon honored today'.不會被匹配
    在mysql數(shù)據(jù)庫中%匹配任意個任意字符,_匹配一個任意字符

  • icontains 不區(qū)分大小的包含匹配

    Example:
    Entry.objects.get(headline__icontains='Lennon')
    SQL equivalent:
    SELECT ... WHERE headline ILIKE '%Lennon%';

  • in 在...范圍內,不連續(xù)的范圍查詢,下面的range是連續(xù)的范圍查詢

    -- id 數(shù)字匹配
    Example:
    Entry.objects.filter(id__in=[1, 3, 4])
    SQL equivalent:
    SELECT ... WHERE id IN (1, 3, 4);

    范圍不只可以是id這些文字值,也可以是實例組成的集合,

    -- 實例對象匹配
    下面的示例是找出所有關聯(lián)了(Blog模型中的name包含Cheddar的實例)的所有Entry實例
    Example:
    inner_qs = Blog.objects.filter(name__contains='Cheddar') #首先查詢出所有的Blog模型中的name包含Cheddar的實例
    entries = Entry.objects.filter(blog__in=inner_qs) #在查詢Entry實例中存在于上面的范圍的實例
    SQL equivalent:
    blog_obj_set = SELECT ... WHERE blog.id IN (SELECT id FROM ... WHERE NAME LIKE '%Cheddar%')
    entries = select * from Entry where blog in blog_obj_set

    -- 字符串值匹配 values方法在本文中也有講解,請在本頁面搜索values
    inner_qs = Blog.objects.filter(name__contains='Ch').values('name')
    entries = Entry.objects.filter(blog__name__in=inner_qs) # blog__name是外鍵模型之間使用其他模型的字段值,在本文使用其他模型字段排序中也有講解

  • gt 大于

    Example:
    Entry.objects.filter(id__gt=4)
    SQL equivalent:
    SELECT ... WHERE id > 4;

  • gte 大于等于

  • lt 小于

  • lte 小于等于

  • startswith 開始位置匹配,區(qū)分大小寫

    Example:
    Entry.objects.filter(headline__startswith='Will')
    SQL equivalent:
    SELECT ... WHERE headline LIKE 'Will%';
    SQLite 不支持區(qū)分大小寫 LIKE 語句; Sqlite 下startswith 等于 istartswith .

  • istartswith 開始位置匹配,不區(qū)分大小寫

    Example:
    Entry.objects.filter(headline__istartswith='will')
    SQL equivalent:
    SELECT ... WHERE headline ILIKE 'Will%';

  • endswith 結束位置匹配,區(qū)分大小寫

    Example:
    Entry.objects.filter(headline__endswith='cats')
    SQL equivalent:
    SELECT ... WHERE headline LIKE '%cats';
    SQLite不支持區(qū)分大小寫的LIKE語句骂际;endswith用作SQLite的iendswith疗琉。

  • iendswith 結束位置匹配,不區(qū)分大小寫

    Example:
    Entry.objects.filter(headline__iendswith='will')
    SQL equivalent:
    SELECT ... WHERE headline ILIKE '%will'

  • range 范圍查詢,連續(xù)的范圍,in是不連續(xù)的范圍

    Example:
    import datetime
    start_date = datetime.date(2005, 1, 1)
    end_date = datetime.date(2005, 3, 31)
    Entry.objects.filter(pub_date__range=(start_date, end_date))
    SQL equivalent:
    SELECT ... WHERE pub_date BETWEEN '2005-01-01' and '2005-03-31';
    過濾具有日期的DateTimeField不會包含最后一天的項目,因為邊界被解釋為“給定日期的0am”歉铝。如果pub_date是DateTimeField盈简,上面的表達式將變成這個SQL:
    SELECT ... WHERE pub_date BETWEEN '2005-01-01 00:00:00' and '2005-03-31 00:00:00';

  • year 對于日期DateField和日期時間DateTimeField字段確切的年匹配,整數(shù)年

    Example:
    Entry.objects.filter(pub_date__year=2005)
    SQL equivalent:
    SELECT ... WHERE pub_date BETWEEN '2005-01-01' AND '2005-12-31';
    當USE_TZ為True UTC時間,在過濾之前太示,datetime字段將轉換為當前時區(qū)柠贤。

  • month 對于日期DateField和日期時間DateTimeField字段確切的月匹配,取整數(shù)1(1月)至12(12月)。

    Example:
    Entry.objects.filter(pub_date__month=12)
    SQL equivalent:
    SELECT ... WHERE EXTRACT('month' FROM pub_date) = '12';
    當USE_TZ為True時类缤,在過濾之前臼勉,datetime字段將轉換為當前時區(qū)。

  • day 對于日期和日期時間字段餐弱,具體到某一天的匹配宴霸。取一個整數(shù)的天數(shù)

    Example:
    Entry.objects.filter(pub_date__day=3)
    SQL equivalent:
    SELECT ... WHERE EXTRACT('day' FROM pub_date) = '3';
    EXTRACT() 函數(shù)用于返回日期/時間的單獨部分,比如年膏蚓、月瓢谢、日、小時驮瞧、分鐘等等氓扛。

  • week_day 對于日期和日期時間字段,“星期幾”匹配

    Example:
    Entry.objects.filter(pub_date__week_day=2)
    注意有的數(shù)據(jù)庫星期幾是從0開始的有的是從1開始的,所以使用這個方法前先查看數(shù)據(jù)庫是從幾開始索引的

  • hour 對于日期時間字段剧董,精確的小時匹配幢尚。取0和23之間的整數(shù)。

    Example:
    Event.objects.filter(timestamp__hour=23)
    SQL equivalent:
    SELECT ... WHERE EXTRACT('hour' FROM timestamp) = '23';

  • minute 對于日期時間字段翅楼,精確的分鐘匹配尉剩。取0和59之間的整數(shù)。

    Example:
    Event.objects.filter(timestamp__minute=29)
    SQL equivalent:
    SELECT ... WHERE EXTRACT('minute' FROM timestamp) = '29';

  • second 對于日期時間字段毅臊,精確的秒匹配理茎。取0和59之間的整數(shù)。

    Example:
    Event.objects.filter(timestamp__second=31)
    SQL equivalent:
    SELECT ... WHERE EXTRACT('second' FROM timestamp) = '31';

  • isnull 值為 True 或 False, 相當于 SQL語句IS NULL和IS NOT NULL.

    Example:
    Entry.objects.filter(pub_date__isnull=True)
    SQL equivalent:
    SELECT ... WHERE pub_date IS NULL;

  • search 一個Boolean類型的全文搜索,以全文搜索的優(yōu)勢皂林。這個很像 contains,但更快

    Example:
    Entry.objects.filter(headline__search="+Django -jazz Python")
    SQL equivalent:
    SELECT ... WHERE MATCH(tablename, headline) AGAINST (+Django -jazz Python IN BOOLEAN MODE);
    注意朗鸠,這僅在MySQL中可用,并且需要直接操作數(shù)據(jù)庫以添加全文索引础倍。默認情況下烛占,Django使用BOOLEAN MODE進行全文搜索

  • regex 區(qū)分大小寫的正則表達式匹配。

    Example:
    Entry.objects.get(title__regex=r'^(An?|The) +')
    SQL equivalents:
    SELECT ... WHERE title REGEXP BINARY '^(An?|The) +'; -- MySQL
    SELECT ... WHERE REGEXP_LIKE(title, '^(an?|the) +', 'c'); -- Oracle
    SELECT ... WHERE title ~ '^(An?|The) +'; -- PostgreSQL
    SELECT ... WHERE title REGEXP '^(An?|The) +'; -- SQLite
    建議使用原始字符串(例如沟启,r'foo'而不是'foo')來傳遞正則表達式語法忆家。(即帶上前面的字母r)

  • iregex 不區(qū)分大小寫的正則表達式匹配。

    Example:
    Entry.objects.get(title__iregex=r'^(an?|the) +')
    SQL equivalents:
    SELECT ... WHERE title REGEXP '^(an?|the) +'; -- MySQL
    SELECT ... WHERE REGEXP_LIKE(title, '^(an?|the) +', 'i'); -- Oracle
    SELECT ... WHERE title ~* '^(an?|the) +'; -- PostgreSQL
    SELECT ... WHERE title REGEXP '(?i)^(an?|the) +'; -- SQLite

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末德迹,一起剝皮案震驚了整個濱河市芽卿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胳搞,老刑警劉巖卸例,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異肌毅,居然都是意外死亡筷转,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門芽腾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來旦装,“玉大人,你說我怎么就攤上這事摊滔∫蹙睿” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵艰躺,是天一觀的道長呻袭。 經常有香客問我,道長腺兴,這世上最難降的妖魔是什么左电? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮页响,結果婚禮上篓足,老公的妹妹穿的比我還像新娘。我一直安慰自己闰蚕,他們只是感情好栈拖,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著没陡,像睡著了一般涩哟。 火紅的嫁衣襯著肌膚如雪索赏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天贴彼,我揣著相機與錄音潜腻,去河邊找鬼。 笑死器仗,一個胖子當著我的面吹牛融涣,可吹牛的內容都是我干的。 我是一名探鬼主播精钮,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼暴心,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了杂拨?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤悯衬,失蹤者是張志新(化名)和其女友劉穎弹沽,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體筋粗,經...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡策橘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了娜亿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丽已。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖买决,靈堂內的尸體忽然破棺而出沛婴,到底是詐尸還是另有隱情,我是刑警寧澤督赤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布嘁灯,位于F島的核電站,受9級特大地震影響躲舌,放射性物質發(fā)生泄漏丑婿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一没卸、第九天 我趴在偏房一處隱蔽的房頂上張望羹奉。 院中可真熱鬧,春花似錦约计、人聲如沸诀拭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炫加。三九已至瑰煎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間俗孝,已是汗流浹背酒甸。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留赋铝,地道東北人插勤。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像革骨,于是被迫代替她去往敵國和親农尖。 傳聞我的和親對象是個殘疾皇子兼贸,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內容