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

ale*_*ine 4 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)
Run Code Online (Sandbox Code Playgroud)

在一个Stuff对象中,我只想更新该name字段,并保持所有其他字段不变,除了在关联Footprint对象中定义的那些字段。

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

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

s.date # is correctly set
Run Code Online (Sandbox Code Playgroud)

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

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

s.date # unfortunately, remains unchanged!!
Run Code Online (Sandbox Code Playgroud)

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

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

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

ale*_*ine 7

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

some_object.save(update_fields = ['updated_field', 'auto_now_date']
Run Code Online (Sandbox Code Playgroud)


ale*_*ine 4

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

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)
Run Code Online (Sandbox Code Playgroud)

当然,如果您要更新的字段不仅仅是一个date字段,您只需将它们附加到列表中即可。