【问题标题】:Overriding save method vs Model Method?覆盖保存方法与模型方法?
【发布时间】:2014-11-24 23:05:39
【问题描述】:

考虑这个取自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)

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

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

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

    在第二种情况下,它只是一个只读的便利属性。因此,在管理员或其他地方显示名称是可以的,但仅此而已。

    因此,使用哪个问题实际上是基于您需要对该领域做什么的设计决策。另一个常见的例子是当您使用某种类型的 slug 字段时(其中 slug 是模型中某些文本的 URL 友好版本)。如果您正在基于ids 进行数据库查找,那么您可能根本不需要将 slug 放入数据库中。但是,如果您想通过 slug 字段查找内容,或者即使文本更改也想保留旧的 slug,则需要将其设为真正的列。

    【讨论】:

    • 谢谢。我现在知道该使用哪个了。
    【解决方案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)
    

    这里 save 方法被覆盖。因此,当您尝试保存 用户对象 时,字段 first_name 将以 first_name last_name 的格式保存。

    _get_full_name 方法在我们尝试使用 User's Querset 对象 调用时只返回 User's last_name 和 first_name 的组合。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-14
      • 1970-01-01
      • 2010-09-15
      • 2013-03-16
      • 1970-01-01
      相关资源
      最近更新 更多