Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django中添加常用日期的最佳方法_Python_Django_Django Models_Save_Django Signals - Fatal编程技术网

Python 在Django中添加常用日期的最佳方法

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

我正在将date_added和date_modified字段添加到我当前项目中的一组常见模型中。我正在对models.Model进行子类化并添加适当的字段,但我想添加自动保存行为(即:每次有人调用MyModel.save(),修改的日期字段都会得到更新。我看到两种方法:重写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)


我不熟悉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)