在Django的模型中添加自定义方法的示例
为了给你的对像添加一个行级功能,那就定义一个自定义方法。有鉴于manager经常被用来用一些整表操作(table-wide),模型方法应该只对特殊模型实例起作用。
这是一项在模型的一个地方集中业务逻辑的技术。
最好用例子来解释一下。这个模型有一些自定义方法:
fromdjango.contrib.localflavor.us.modelsimportUSStateField
fromdjango.dbimportmodels
classPerson(models.Model):
first_name=models.CharField(max_length=50)
last_name=models.CharField(max_length=50)
birth_date=models.DateField()
address=models.CharField(max_length=100)
city=models.CharField(max_length=50)
state=USStateField()#Yes,thisisU.S.-centric...
defbaby_boomer_status(self):
"Returnstheperson'sbaby-boomerstatus."
importdatetime
ifdatetime.date(1945,8,1)<=self.birth_date<=datetime.date(1964,12,31):
return"Babyboomer"
ifself.birth_date<datetime.date(1945,8,1):
return"Pre-boomer"
return"Post-boomer"
defis_midwestern(self):
"ReturnsTrueifthispersonisfromtheMidwest."
returnself.statein('IL','WI','MI','IN','OH','IA','MO')
def_get_full_name(self):
"Returnstheperson'sfullname."
returnu'%s%s'%(self.first_name,self.last_name)
full_name=property(_get_full_name)
例子中的最后一个方法是一个property。想了解更多关于属性的信息请访问http://www.python.org/download/releases/2.2/descrintro/#property
这是用法的实例:
>>>p=Person.objects.get(first_name='Barack',last_name='Obama') >>>p.birth_date datetime.date(1961,8,4) >>>p.baby_boomer_status() 'Babyboomer' >>>p.is_midwestern() True >>>p.full_name#Notethisisn'tamethod--it'streatedasanattribute u'BarackObama'