首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >暂时禁用auto_now / auto_now_add

暂时禁用auto_now / auto_now_add
EN

Stack Overflow用户
提问于 2011-09-21 20:31:45
回答 13查看 31.4K关注 0票数 118

我有一个这样的模型:

代码语言:javascript
运行
复制
class FooBar(models.Model):
    createtime = models.DateTimeField(auto_now_add=True)
    lastupdatetime = models.DateTimeField(auto_now=True)

我想覆盖一些模型实例的两个日期字段(在迁移数据时使用)。当前的解决方案如下所示:

代码语言:javascript
运行
复制
for field in new_entry._meta.local_fields:
    if field.name == "lastupdatetime":
        field.auto_now = False
    elif field.name == "createtime":
        field.auto_now_add = False

new_entry.createtime = date
new_entry.lastupdatetime = date
new_entry.save()

for field in new_entry._meta.local_fields:
    if field.name == "lastupdatetime":
        field.auto_now = True
    elif field.name == "createtime":
        field.auto_now_add = True

有没有更好的解决方案?

EN

回答 13

Stack Overflow用户

发布于 2012-07-04 02:07:22

我最近在测试我的应用程序时遇到了这种情况。我需要“强制”一个过期的时间戳。在我的例子中,我通过使用查询集更新完成了这项工作。如下所示:

代码语言:javascript
运行
复制
# my model
class FooBar(models.Model):
    title = models.CharField(max_length=255)
    updated_at = models.DateTimeField(auto_now=True, auto_now_add=True)



# my tests
foo = FooBar.objects.get(pk=1)

# force a timestamp
lastweek = datetime.datetime.now() - datetime.timedelta(days=7)
FooBar.objects.filter(pk=foo.pk).update(updated_at=lastweek)

# do the testing.
票数 113
EN

Stack Overflow用户

发布于 2011-09-21 23:31:46

您不能真正禁用auto_now/auto_now_add,除非您已经这样做了。如果您需要灵活地更改这些值,则auto_now/auto_now_add不是最佳选择。通常,在保存对象之前使用default和/或覆盖save()方法进行操作更为灵活。

使用default和覆盖的save()方法,解决问题的一种方法是像这样定义模型:

代码语言:javascript
运行
复制
class FooBar(models.Model):
    createtime = models.DateTimeField(default=datetime.datetime.now)
    lastupdatetime = models.DateTimeField()

    def save(self, *args, **kwargs):
        if not kwargs.pop('skip_lastupdatetime', False):
            self.lastupdatetime = datetime.datetime.now()

        super(FooBar, self).save(*args, **kwargs)

在您的代码中,如果您想跳过lastupdatetime的自动更改,只需使用

代码语言:javascript
运行
复制
new_entry.save(skip_lastupdatetime=True)

如果您的对象保存在管理界面或其他位置,则将调用auto_now ()而不带skip_lastupdatetime参数,并且它的行为将与以前使用save时一样。

票数 57
EN

Stack Overflow用户

发布于 2017-01-17 11:21:37

您还可以使用save()update_fields参数并传递您的auto_now字段。下面是一个例子:

代码语言:javascript
运行
复制
# Date you want to force
new_created_date = date(year=2019, month=1, day=1)
# The `created` field is `auto_now` in your model
instance.created = new_created_date
instance.save(update_fields=['created'])

下面是Django文档中的解释:https://docs.djangoproject.com/en/stable/ref/models/instances/#specifying-which-fields-to-save

票数 40
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7499767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档