當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python Django QuerySet.order_by用法及代碼示例


本文介紹 django.db.models.query.QuerySet.order_by 的用法。

聲明

order_by(*fields)

默認情況下,QuerySet 返回的結果由模型的 Meta 中的 ordering 選項給出的排序元組排序。您可以使用order_by 方法在每個QuerySet 的基礎上覆蓋它。

例子:

Entry.objects.filter(pub_date__year=2005).order_by('-pub_date', 'headline')

上麵的結果將按 pub_date 降序排列,然後按 headline 升序排列。 "-pub_date"前麵的負號表示descending順序。升序是隱含的。要隨機排序,請使用 "?" ,如下所示:

Entry.objects.order_by('?')

注意:order_by('?') 查詢可能既昂貴又緩慢,具體取決於您使用的數據庫後端。

要按不同模型中的字段排序,請使用與跨模型關係查詢時相同的語法。也就是說,字段的名稱後跟雙下劃線 (__),然後是新模型中的字段名稱,依此類推,以加入任意數量的模型。例如:

Entry.objects.order_by('blog__name', 'headline')

如果您嘗試按與另一個模型相關的字段排序,Django 將使用相關模型的默認排序,或者如果沒有指定 Meta.ordering ,則按相關模型的主鍵排序。例如,由於 Blog 模型沒有指定默認排序:

Entry.objects.order_by('blog')

…等同於:

Entry.objects.order_by('blog__id')

如果 Blogordering = ['name'] ,那麽第一個查詢集將等同於:

Entry.objects.order_by('blog__name')

您還可以通過在表達式上調用 asc() desc() 來按查詢表達式排序:

Entry.objects.order_by(Coalesce('summary', 'headline').desc())

asc() desc() 具有控製空值排序方式的參數( nulls_firstnulls_last )。

如果您還使用 distinct() ,則在相關模型中按字段排序時要小心。請參閱 distinct() 中的注釋,了解相關模型排序如何改變預期結果。

注意

允許指定 multi-valued 字段來對結果進行排序(例如, ManyToManyField 字段,或 ForeignKey 字段的反向關係)。

考慮這種情況:

class Event(Model):
   parent = models.ForeignKey(
       'self',
       on_delete=models.CASCADE,
       related_name='children',
   )
   date = models.DateField()

Event.objects.order_by('children__date')

在這裏,每個 Event 可能有多個排序數據;每個帶有多個 childrenEvent 將多次返回到 order_by() 創建的新 QuerySet 中。換句話說,在QuerySet 上使用order_by() 可能會返回比您開始工作時更多的項目——這可能既不是預期的也不是有用的。

因此,在使用multi-valued 字段對結果進行排序時要小心。如果您可以確定您排序的每件商品隻有一個排序數據,那麽這種方法應該不會出現問題。如果沒有,請確保結果符合您的預期。

沒有辦法指定排序是否應該區分大小寫。關於區分大小寫,Django 將對結果進行排序,但是您的數據庫後端通常會對其進行排序。

您可以使用 Lower 將字段轉換為小寫,這將實現 case-consistent 排序:

Entry.objects.order_by(Lower('headline').desc())

如果您不希望對查詢應用任何排序,甚至是默認排序,請不帶參數調用 order_by()

您可以通過檢查 QuerySet.ordered 屬性來判斷查詢是否已排序,如果QuerySet 已以任何方式排序,則該屬性將為True

每個 order_by() 調用將清除任何先前的排序。例如,此查詢將按 pub_date 而不是 headline 排序:

Entry.objects.order_by('headline').order_by('pub_date')

警告

排序不是免費的操作。您添加到排序中的每個字段都會對您的數據庫產生成本。您添加的每個外鍵也將隱式包含其所有默認排序。

如果查詢未指定排序,則以未指定的順序從數據庫返回結果。僅當按一組唯一標識結果中每個對象的字段進行排序時,才能保證特定的排序。例如,如果 name 字段不是唯一的,則按它排序並不能保證具有相同名稱的對象總是以相同的順序出現。

相關用法


注:本文由純淨天空篩選整理自djangoproject.com大神的英文原創作品 django.db.models.query.QuerySet.order_by。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。