前提:這里根據(jù)下面的兩個基礎(chǔ)model來講解一下model field的排序問題
class Business(models.Model):
name = models.CharField(_("名稱"), max_length=LEN_NORMAL, null=True)
type = models.CharField(_("類別"), max_length=LEN_SHORT, choices=TYPE)
is_access_cleanup = models.BooleanField(_("是否接入清理"), default=False)
class Meta:
db_table = 'business'
verbose_name = verbose_name_plural = "業(yè)務(wù)系統(tǒng)"
class Database(models.Model):
business = models.ForeignKey(Business, related_name="databases", on_delete=models.CASCADE)
alias_name = models.CharField(_("服務(wù)名"), max_length=LEN_LONG, null=True)
ip = models.GenericIPAddressField(_("數(shù)據(jù)庫IP"))
port = models.SmallIntegerField(_("端口"), default=1521)
class Meta:
db_table = 'database'
verbose_name = verbose_name_plural = "數(shù)據(jù)庫"
基礎(chǔ)排序
在日常開發(fā)中,我沒經(jīng)常遇到需要根據(jù)model字段排序的功能立叛。常用的model排序方法有兩種
方法一:order_by函數(shù)
例如:我們需要根據(jù)字段ip
對Database
進行排序谓着。我們可以這樣
Database.objects.all().order_by('-ip')
其中,'ip'表示升序骂束; '-ip'表示降序。升序時可以不寫成箫,是默認展箱。
也可以這樣使用
Database.objects.order_by('-ip')
.all()可以省略。 默認查詢所有蹬昌。 也可以結(jié)合filter等函數(shù)一起使用 混驰。
也可以多個字段一起查詢
Database.objects.order_by('-ip', 'port')
含義:先根據(jù)ip進行倒序排列,再根據(jù)port進行正序排列
方法二:model中的Meta選項ordering
class Database(models.Model):
business = models.ForeignKey(Business, related_name="databases", on_delete=models.CASCADE)
alias_name = models.CharField(_("服務(wù)名"), max_length=LEN_LONG, null=True)
ip = models.GenericIPAddressField(_("數(shù)據(jù)庫IP"))
port = models.SmallIntegerField(_("端口"), default=1521)
class Meta:
db_table = 'database'
verbose_name = verbose_name_plural = "數(shù)據(jù)庫"
ordering = ('-ip',)
ordering它是一個字符串的列表或元組。每個字符串是一個字段名账胧,前面帶有可選的“-”前綴表示倒序竞慢。前面沒有“-”的字段表示正序。使用"?"來表示隨機排序治泥。
也可以多字段查詢
ordering = ('-ip', 'port')
功能跟order_by
一樣
根據(jù)外鍵字段排序
例如筹煮,我想實現(xiàn)根據(jù)Business
中的type
字段對Database
進行排序
我們可以這樣實現(xiàn),使用雙下劃線__
在排序子句中遵循關(guān)系來實現(xiàn)
Database.objects.order_by('business__type')
寫在最后
排序并不是沒有任何代價的操作居夹。你向ordering屬性添加的每個字段都會產(chǎn)生你數(shù)據(jù)庫的開銷败潦。