在Django中为多个模型添加通用的date_added和date_modified的最佳方法
我正在给我当前项目中的一些常见模型添加日期字段,比如添加“创建日期”和“修改日期”。我在继承 models.Model 的基础上添加了这些字段,但我想让保存操作自动更新“修改日期”字段。也就是说,每次有人调用 MyModel.save() 时,修改日期都会更新。我看到有两种方法可以实现这个功能:一种是重写 save() 方法,另一种是在抽象基类中添加一个 pre_save 信号处理器。
class CommonData(models.Model):
date_added = models.DateTimeField(default=datetime.datetime.today,null=False,blank=False)
date_modified = models.DateTimeField(default=datetime.datetime.today,null=True,blank=True)
# register a handler for the pre_save to update date_modified
def pre_save_handler(sender, **kwargs):
date_modified = datetime.datetime.today
def __init__():
pre_save.connect(pre_save_handler, sender=self)
或者
class CommonData(models.Model):
date_added = models.DateTimeField(default=datetime.datetime.today,null=False,blank=False)
date_modified = models.DateTimeField(default=datetime.datetime.today,null=True,blank=True)
# overriding save
def save(force_insert=False,force_update=False):
date_modified = datetime.datetime.now
return models.Model.save(force_insert, force_update)
我对 Django 和 Python 还不太熟悉,想知道哪种方法更符合“django”的风格?哪种方法更高效?哪种是“正确”的做法呢?
4 个回答
你可以在一个抽象基类中定义这些内容,然后从这个类继承。这有点像是一个混合类,它同时也定义了模型的字段。
你有没有试过看看 DateTimeField
的 auto_now=True
和 auto_now_add=True
这两个选项?它们可以自动完成你需要的功能。否则,自己去重写保存方法和使用信号处理其实没什么区别——实际上,pre_save 信号是从 Django 模型的保存方法中调用的。
文档链接: http://docs.djangoproject.com/en/dev/ref/models/fields/#datefield
因为你刚开始接触Django,所以你可能会觉得Django命令扩展很有用:
http://code.google.com/p/django-command-extensions/
这个扩展里有一个叫做TimeStampedModel的东西,你可以用它来创建自己的模型:
http://code.google.com/p/django-command-extensions/wiki/ModelExtensions
这是一个抽象的基础类模型,它提供了自动管理的“创建时间”和“修改时间”字段。