W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
在模型中添加自定義方法會給你的對象提供自定義的“行級”操作能力。與之對應(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?
?。
另一個常見的模式是在模型方法和模塊方法中編寫自定義 SQL 語句。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: