在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'