本文介紹 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')
如果 Blog
有 ordering = ['name']
,那麽第一個查詢集將等同於:
Entry.objects.order_by('blog__name')
您還可以通過在表達式上調用
或 asc()
來按查詢表達式排序:desc()
Entry.objects.order_by(Coalesce('summary', 'headline').desc())
和 asc()
具有控製空值排序方式的參數( desc()
nulls_first
和 nulls_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
可能有多個排序數據;每個帶有多個 children
的 Event
將多次返回到 order_by()
創建的新 QuerySet
中。換句話說,在QuerySet
上使用order_by()
可能會返回比您開始工作時更多的項目——這可能既不是預期的也不是有用的。
因此,在使用multi-valued 字段對結果進行排序時要小心。如果您可以確定您排序的每件商品隻有一個排序數據,那麽這種方法應該不會出現問題。如果沒有,請確保結果符合您的預期。
沒有辦法指定排序是否應該區分大小寫。關於區分大小寫,Django 將對結果進行排序,但是您的數據庫後端通常會對其進行排序。
您可以使用
將字段轉換為小寫,這將實現 case-consistent 排序:Lower
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
字段不是唯一的,則按它排序並不能保證具有相同名稱的對象總是以相同的順序出現。
相關用法
- Python Django QuerySet.only用法及代碼示例
- Python Django QuerySet.select_related用法及代碼示例
- Python Django QuerySet.union用法及代碼示例
- Python Django QuerySet.latest用法及代碼示例
- Python Django QuerySet.values用法及代碼示例
- Python Django QuerySet.intersection用法及代碼示例
- Python Django QuerySet.get用法及代碼示例
- Python Django QuerySet.none用法及代碼示例
- Python Django QuerySet.exclude用法及代碼示例
- Python Django QuerySet.get_or_create用法及代碼示例
- Python Django QuerySet.update_or_create用法及代碼示例
- Python Django QuerySet.prefetch_related用法及代碼示例
- Python Django QuerySet.first用法及代碼示例
- Python Django QuerySet.annotate用法及代碼示例
- Python Django QuerySet.dates用法及代碼示例
- Python Django QuerySet.values_list用法及代碼示例
- Python Django QuerySet.select_for_update用法及代碼示例
- Python Django QuerySet.bulk_update用法及代碼示例
- Python Django QuerySet.in_bulk用法及代碼示例
- Python Django QuerySet.defer用法及代碼示例
- Python Django QuerySet.aggregate用法及代碼示例
- Python Django QuerySet.reverse用法及代碼示例
- Python Django QuerySet.count用法及代碼示例
- Python Django QuerySet.exists用法及代碼示例
- Python Django QuerySet.explain用法及代碼示例
注:本文由純淨天空篩選整理自djangoproject.com大神的英文原創作品 django.db.models.query.QuerySet.order_by。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。