4

我正在将 date_added 和 date_modified 字段添加到我当前项目中的一堆常见模型中。我正在继承 models.Model 并添加适当的字段,但我想添加自动保存行为(即:每次有人调用 MyModel.save() 时,date_modified 字段都会更新。我看到两种方法:覆盖 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

4 回答 4

4

您是否尝试查看DateTimeField'sauto_now=Trueauto_now_add=True?他们会自动完成您需要的工作。否则,进行保存覆盖和信号处理之间没有真正的区别 - 事实上,pre_save 信号是从 django 模型的保存方法中调用的。

文档:http ://docs.djangoproject.com/en/dev/ref/models/fields/#datefield

于 2009-12-24T19:02:17.030 回答
4

由于您是 Django 新手,您可能会发现 Django 命令扩展很有用:

http://code.google.com/p/django-command-extensions/

...它方便地包括一个 TimeStampedModel 您可以从中派生模型:

http://code.google.com/p/django-command-extensions/wiki/ModelExtensions

提供自我管理的“创建”和“修改”字段的抽象基类模型。

于 2009-12-24T22:23:53.287 回答
2

您可以在抽象基类中定义它们,然后从中继承。这有点像拥有一个也定义模型字段的 MixIn。

于 2009-12-24T18:35:22.370 回答
1

请注意auto_now_addandauto_now使用, which 在或pre_save时不起作用。因此,例如,在您的 MySQL 中,date_added 字段将为 '0000-00-00 00:00:00',并且可能会收到警告:'Warning: Column 'date_added' cannot be null'。所以你可以使用 auto_now* 但你应该小心。bulk_createupdate

于 2013-01-22T08:43:10.747 回答