Django4.0 模型-方法

2022-03-16 18:05 更新

在模型中添加自定義方法會(huì)給你的對(duì)象提供自定義的“行級(jí)”操作能力。與之對(duì)應(yīng)的是類 ??Manager??的方法意在提供“表級(jí)”的操作,模型方法應(yīng)該在某個(gè)對(duì)象實(shí)例上生效。這是一個(gè)將相關(guān)邏輯代碼放在一個(gè)地方的技巧——模型。比如,該模型有一些自定義方法:

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    birth_date = models.DateField()

    def baby_boomer_status(self):
        "Returns the person's baby-boomer status."
        import datetime
        if self.birth_date < datetime.date(1945, 8, 1):
            return "Pre-boomer"
        elif self.birth_date < datetime.date(1965, 1, 1):
            return "Baby boomer"
        else:
            return "Post-boomer"

    @property
    def full_name(self):
        "Returns the person's full name."
        return '%s %s' % (self.first_name, self.last_name)
  • ??__str__()??:返回值展示了一個(gè)對(duì)象。Python 和 Django 在要將模型實(shí)例展示為純文本時(shí)調(diào)用。最有可能的應(yīng)用場(chǎng)景是交互式控制臺(tái)或后臺(tái)。你將會(huì)經(jīng)常定義此方法;默認(rèn)提供的不是很好用。
  • ??get_absolute_url()??:該方法告訴 Django 如何計(jì)算一個(gè)對(duì)象的 URL。Django 在后臺(tái)接口使用此方法,或任意時(shí)間它需要計(jì)算一個(gè)對(duì)象的 URL。任何需要一個(gè)唯一 URL 的對(duì)象需要定義此方法。

重寫之前定義的模型方法

還有一個(gè) 模型方法 的集合,包含了一些你可能自定義的數(shù)據(jù)庫行為。尤其是這兩個(gè)你最有可能定制的方法 ??save()?? 和 ??delete()??。你可以隨意地重寫這些方法(或其它模型方法)來更改方法的行為。一個(gè)典型的重寫內(nèi)置方法的場(chǎng)景是你想在保存對(duì)象時(shí)額外做些事。

from django.db import models

class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

    def save(self, *args, **kwargs):
        do_something()
        super().save(*args, **kwargs)  # Call the "real" save() method.
        do_something_else()

你也可以阻止保存:

from django.db import models

class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

    def save(self, *args, **kwargs):
        if self.name == "Yoko Ono's blog":
            return # Yoko shall never have her own blog!
        else:
            super().save(*args, **kwargs)  # Call the "real" save() method.

調(diào)用父類的方法非常重要——這里指 ??super().save(*args, **kwargs)?? ——確保對(duì)象正確的寫入數(shù)據(jù)庫。若你忘記調(diào)用父類方法,默認(rèn)行為不會(huì)被觸發(fā),數(shù)據(jù)庫也不會(huì)被操作。同時(shí)傳遞模型方法接受的參數(shù)也很重要—— ??*args??, ??**kwargs?? 會(huì)接受這些參數(shù)。Django 會(huì)不時(shí)地?cái)U(kuò)展模型內(nèi)置方法的功能,也會(huì)添加新參數(shù)。如果你在重寫的方法中使用了? ?*args??, ??**kwargs??,這將確保你的方法能接受這些新加的參數(shù)。

注意:

重寫的模型方法不會(huì)在批量操作中調(diào)用。

刪除一個(gè)模型對(duì)象不總是要調(diào)用 ??delete()?? 方法。例如,使用 ?QuerySet ?批量刪除對(duì)象 ?<topics-db-queries-delete>? 和 級(jí)聯(lián)刪除。為了確保自定義的刪除邏輯被執(zhí)行,你可以使用 ??pre_delete??和 ??post_delete??信號(hào)。不幸的是,批量 ??creating??和 ??updating??操作不支持上述操作,因?yàn)檫@兩種操作未調(diào)用 ??save()??,??pre_save?? 和 ??post_save??。

執(zhí)行自定義SQL

另一個(gè)常見的模式是在模型方法和模塊方法中編寫自定義 SQL 語句。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)