Django之Model Field排序

前提:這里根據(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ù)的開銷。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容