Django4.0 模型-方法

2022-03-16 18:05 更新

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

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__()??:返回值展示了一個對象。Python 和 Django 在要將模型實例展示為純文本時調(diào)用。最有可能的應(yīng)用場景是交互式控制臺或后臺。你將會經(jīng)常定義此方法;默認提供的不是很好用。
  • ??get_absolute_url()??:該方法告訴 Django 如何計算一個對象的 URL。Django 在后臺接口使用此方法,或任意時間它需要計算一個對象的 URL。任何需要一個唯一 URL 的對象需要定義此方法。

重寫之前定義的模型方法

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

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)?? ——確保對象正確的寫入數(shù)據(jù)庫。若你忘記調(diào)用父類方法,默認行為不會被觸發(fā),數(shù)據(jù)庫也不會被操作。同時傳遞模型方法接受的參數(shù)也很重要—— ??*args??, ??**kwargs?? 會接受這些參數(shù)。Django 會不時地擴展模型內(nèi)置方法的功能,也會添加新參數(shù)。如果你在重寫的方法中使用了? ?*args??, ??**kwargs??,這將確保你的方法能接受這些新加的參數(shù)。

注意:

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

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

執(zhí)行自定義SQL

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


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號