Python 在Django中添加常用日期的最佳方法
我正在将date_added和date_modified字段添加到我当前项目中的一组常见模型中。我正在对models.Model进行子类化并添加适当的字段,但我想添加自动保存行为(即:每次有人调用MyModel.save(),修改的日期字段都会得到更新。我看到两种方法:重写save()方法或在抽象基类中添加预保存信号处理程序Python 在Django中添加常用日期的最佳方法,python,django,django-models,save,django-signals,Python,Django,Django Models,Save,Django Signals,我正在将date_added和date_modified字段添加到我当前项目中的一组常见模型中。我正在对models.Model进行子类化并添加适当的字段,但我想添加自动保存行为(即:每次有人调用MyModel.save(),修改的日期字段都会得到更新。我看到两种方法:重写save()方法或在抽象基类中添加预保存信号处理程序 class CommonData(models.Model): date_added = models.DateTimeField(default=datetime
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)
或
我不熟悉Django和Python,想知道哪种方法更“Django”?哪种更有效?哪种方法“正确”方法?您可以在中定义这些,然后从中继承。这有点像有一个MixIn,它也定义了模型字段。您是否尝试过查看
日期时间字段的自动现在=真和自动现在添加=真?它们会自动执行您需要的操作。否则,就没有真正的区别了在执行save覆盖和信号处理时-实际上,pre_save信号是从django模型的save方法调用的
文档:由于您是Django新手,您可能会发现Django命令扩展非常有用:
…其中方便地包括一个TimestamedModel,您可以从中导出模型:
提供自我管理的“创建”和“修改”字段的抽象基类模型
请注意,auto\u now\u add
和auto\u now
使用pre\u save
,当bulk\u create
或update
时,它们不起作用。因此,在MySQL中,例如,添加的日期字段将是“0000-00-00:00:00”,并且可能得到警告:“警告:列“添加的日期”不能为空”。因此,您可以使用auto\u now*但是你应该小心。谢谢Peter,这就是我在做的,我的问题是关于实现默认功能的最佳方式的一点更多:信号verus方法重写。我想信号更像是一个混音,方法重写更像是有默认功能不?你是对的,我在没有eno的情况下快速移动呃,咖啡因。Kibitzer的答案是完全正确的。感谢普罗米修斯,我不知道命令扩展。我喜欢python/django…但是,有很多方法可以做事情!auto_now和auto_now_add现在被认为是不可靠的。最好在save方法中设置日期。这是其他建议的解决方案(使用ABC)所使用的。
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)