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

时间:2013-07-04 15:37:30

标签: django model-inheritance

模型定义:

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对象中定义的字段除外。

如果我不使用Footprint,则update_fields对象中的字段会正确更新:

s = Stuff.objects.get(pk = 1)
s.name = 'Alexander'
s.save()

s.date # is correctly set

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

s = Stuff.objects.get(pk = 1)
s.name = 'Tim'
s.save(update_fields = ['name'])

s.date # unfortunately, remains unchanged!!

我必须使用update_fields来避免多个脚本之间的干扰。

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

即使Footprint.save()不包含update_fields中的任何字段,也有办法强制拨打Footprint吗?

3 个答案:

答案 0 :(得分:1)

只需简单地重写Footprint模型定义就足够了:

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字段,则只需将它们附加到列表中即可。

答案 1 :(得分:1)

不是重写save()方法,另一种可能是将auto_now选项的所有字段添加到update参数。像这样:

some_object.save(update_fields = ['updated_field', 'auto_now_date']

答案 2 :(得分:0)

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

在您的课程中添加此功能定义:

def save(self, *args, **kwargs):
    # Do something here, whatever it is that you want
    return super(<YourClassName>, self).save(self, *args, **kwargs)

这样可以保持正常save()功能的功能不变,并将自定义更改添加到您想要进行的更改中。