2014-11-24 53 views
1

考虑这个例子从Querying full name采取:覆盖保存方法vs模型方法?

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

在第一种情况下,full_name是数据库中的一列。因此,如果您需要针对它运行数据库查询,请使用它。

在第二种情况下,它只是一个只读的便利属性。因此,在管理员或其他地方显示名称是很好的,但这就是关于它的。

所以,使用哪个问题实际上是一个基于您需要对该领域做什么的设计决策。另一个常见的例子是当你使用某种类型的slug字段时(slug是模型中某些文本的URL友好版本)。如果您正在根据ids进行数据库查找,那么根本不需要将slug放入数据库。但是如果你想要通过slug字段来查看事件,或者即使文本改变时你想保留旧的slug,你也会希望将它变成真正的列。

+0

谢谢。我现在明白要使用哪个。 – norbertpy 2014-11-24 23:25:02

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) 

那么在这里保存方法被覆盖。因此,当您尝试保存用户对象时,该域名名字将被保存为格式为名字姓氏

enter image description here

enter image description here

_get_full_name方法只返回用户姓氏的组合和FIRST_NAME当我们尝试使用用户Querset对象调用它。

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