考虑从Querying full name获取此示例:
class User( models.Model ):
first_name = models.CharField( max_length=64 )
last_name = models.CharField( max_length=64 )
full_name = models.CharField( max_length=128 )
def save( self, *args, **kw ):
self.full_name = '{0} {1}'.format( first_name, last_name )
super( User, self ).save( *args, **kw )
根据Django Model Method,这也可以这样写:
class User(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
def _get_full_name(self):
"Returns the person's full name."
return '%s %s' % (self.first_name, self.last_name)
full_name = property(_get_full_name)
有什么区别?推荐哪一个?
答案 0 :(得分:2)
在第一种情况下,full_name
是数据库中的一列。因此,如果您需要针对它运行数据库查询,请使用此方法。
在第二种情况下,它只是一个只读的便利属性。因此,在管理员或其他地方显示名称是可以的,但这是关于它的。
因此,使用哪个问题实际上是一个基于您需要对该领域做什么的设计决策。另一个常见的例子是当你使用某种slug字段时(slug是模型中某些文本的URL友好版本)。如果您正在基于ids
进行数据库查找,那么您可能根本不需要将slug放入数据库中。但是如果你想通过slug字段查找内容,或者如果你想保留旧的slug,即使文本发生了变化,你也希望将它变成一个真正的列。
答案 1 :(得分:2)
class User(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
def save( self, *args, **kw ):
self.first_name = '{0} {1}'.format( self.first_name, self.last_name )
super( User, self ).save( *args, **kw )
def _get_full_name(self):
"Returns the person's full name."
return '%s %s' % (self.last_name, self.first_name)
full_name = property(_get_full_name)
这里保存方法已被覆盖。因此,当您尝试保存用户对象时,字段 first_name 将以格式 first_name last_name 保存。
_get_full_name 方法只会在我们尝试使用用户的Querset对象<来回调用用户的last_name和first_name 时返回<用户&#39; /强>
>>> from Question.models import *
>>> user_objects = User.objects.all()
>>> for obj in user_objects:
... print "User's First Name :", obj.first_name
... print "User's Last Name :", obj.last_name
... print "User's Full Name :", obj._get_full_name()
...
User's First Name : Tanveer Alam
User's Last Name : Alam
User's Full Name : Alam Tanveer Alam