前提:這里根據(jù)下面的兩個(gè)基礎(chǔ)model來(lái)講解一下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ù)庫(kù)IP"))
port = models.SmallIntegerField(_("端口"), default=1521)
class Meta:
db_table = 'database'
verbose_name = verbose_name_plural = "數(shù)據(jù)庫(kù)"
基礎(chǔ)排序
在日常開發(fā)中,我沒經(jīng)常遇到需要根據(jù)model字段排序的功能。常用的model排序方法有兩種
方法一:order_by函數(shù)
例如:我們需要根據(jù)字段ip對(duì)Database進(jìn)行排序。我們可以這樣
Database.objects.all().order_by('-ip')
其中,'ip'表示升序; '-ip'表示降序。升序時(shí)可以不寫,是默認(rèn)。
也可以這樣使用
Database.objects.order_by('-ip')
.all()可以省略。 默認(rèn)查詢所有。 也可以結(jié)合filter等函數(shù)一起使用 。
也可以多個(gè)字段一起查詢
Database.objects.order_by('-ip', 'port')
含義:先根據(jù)ip進(jìn)行倒序排列,再根據(jù)port進(jìn)行正序排列
方法二:model中的Meta選項(xiàng)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ù)庫(kù)IP"))
port = models.SmallIntegerField(_("端口"), default=1521)
class Meta:
db_table = 'database'
verbose_name = verbose_name_plural = "數(shù)據(jù)庫(kù)"
ordering = ('-ip',)
ordering它是一個(gè)字符串的列表或元組。每個(gè)字符串是一個(gè)字段名,前面帶有可選的“-”前綴表示倒序。前面沒有“-”的字段表示正序。使用"?"來(lái)表示隨機(jī)排序。
也可以多字段查詢
ordering = ('-ip', 'port')
功能跟order_by一樣
根據(jù)外鍵字段排序
例如,我想實(shí)現(xiàn)根據(jù)Business中的type字段對(duì)Database進(jìn)行排序
我們可以這樣實(shí)現(xiàn),使用雙下劃線__在排序子句中遵循關(guān)系來(lái)實(shí)現(xiàn)
Database.objects.order_by('business__type')
寫在最后
排序并不是沒有任何代價(jià)的操作。你向ordering屬性添加的每個(gè)字段都會(huì)產(chǎn)生你數(shù)據(jù)庫(kù)的開銷。