覆盖保存方法与模型方法?

时间:2014-11-24 23:05:39

标签: python django django-models

考虑从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)

有什么区别?推荐哪一个?

2 个答案:

答案 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 保存。

enter image description here

enter image description here

_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