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