首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用save时强制执行auto_now (update_fields= […])

使用save时强制执行auto_now (update_fields= […])
EN

Stack Overflow用户
提问于 2013-07-04 23:37:30
回答 3查看 2.7K关注 0票数 4

模型定义:

代码语言:javascript
复制
class Footprint(models.Model)
  date = models.DateTimeField(auto_now = True)

class Stuff(Footprint):
  name = models.CharField(max_length = 255)
  some_other_field = models.CharField(max_length = 255)

Stuff对象中,我只想更新name字段,而保持所有其他字段不变,关联的Footprint对象中定义的字段除外。

如果不使用update_fieldsFootprint对象中的字段会正确更新

代码语言:javascript
复制
s = Stuff.objects.get(pk = 1)
s.name = 'Alexander'
s.save()

s.date # is correctly set

但是,如果我指定要更新的字段,则关联的Footprint甚至不会被保存。

代码语言:javascript
复制
s = Stuff.objects.get(pk = 1)
s.name = 'Tim'
s.save(update_fields = ['name'])

s.date # unfortunately, remains unchanged!!

我必须使用update_fields来避免几个脚本之间的冲突。

同时,我希望始终跟踪由"Footprint“对象定义的最后一次修改(它包含最后一次修改日期以及其他几个字段;它们的更新是由自定义save()方法触发的)。

有没有办法强制调用Footprint.save(),即使update_fields不包含来自Footprint的任何字段

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-09 13:47:53

只需像这样重写Footprint模型定义就足够了:

代码语言:javascript
复制
class Footprint(models.Model)
  date = models.DateTimeField(auto_now = True)

  def save(self, *args, **kwargs):
    if kwargs.has_key('update_fields'):
      kwargs['update_fields'] = list(set(list(kwargs['update_fields']) + ['date']))

    return super(Footprint, self).save(*args, **kwargs)

当然,如果您有更多的字段需要更新,而不仅仅是一个date字段,那么您只需将它们追加到列表中。

票数 2
EN

Stack Overflow用户

发布于 2015-09-29 19:14:05

另一种方法是使用auto_now选项将所有字段添加到update参数中,而不是重写save()方法。如下所示:

代码语言:javascript
复制
some_object.save(update_fields = ['updated_field', 'auto_now_date']
票数 8
EN

Stack Overflow用户

发布于 2013-07-05 01:16:42

您可以通过更改.save()方法来完成此操作。现在,我确定了你到底想要做什么,所以我会给你一个模板,因为我相信想要有你自己的方式保存更改确实是你想要的。

在您的类中添加以下函数定义:

代码语言:javascript
复制
def save(self, *args, **kwargs):
    # Do something here, whatever it is that you want
    return super(<YourClassName>, self).save(self, *args, **kwargs)

这将保持普通save()函数的功能不变,并将您的自定义更改添加到您想要进行的更改中。

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

https://stackoverflow.com/questions/17474057

复制
相关文章

相似问题

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