Django 使用保存时立即强制执行自动(更新字段=[…;])

Django 使用保存时立即强制执行自动(更新字段=[…;]),django,model-inheritance,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字段,并保留所有其他字段不变,但相关Foot

模型定义:

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\u字段,则
Footprint
对象中的字段将正确更新:

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

s.date # is correctly set
但是,如果我指定要更新的字段,则关联的
示意图
甚至不会保存

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

s.date # unfortunately, remains unchanged!!
我必须使用
update_字段
,以避免多个脚本之间的干扰

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


是否有一种方法可以强制调用
Footprint.save()
,即使
update\u fields
不包含
Footprint
中的任何字段?

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

在类中添加此函数定义:

def save(self, *args, **kwargs):
    # Do something here, whatever it is that you want
    return super(<YourClassName>, self).save(self, *args, **kwargs)
def保存(self,*args,**kwargs):
#在这里做点什么,你想做什么就做什么
返回super(,self).save(self,*args,**kwargs)

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

只需像这样简单地重写封装外形模型定义即可:

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

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

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

谢谢你,这实际上可能是我要求的一种方式。在调用
super()
之前,我可以在save方法中添加
p.footprint\u ptr.save()
,前提是存在
update\u fields
参数。由于许多模型继承自
封装
,有没有避免冗余代码的方法?(只有
每次都会有所不同)好吧,您可以将save转换为classmethod,但如果出现任何问题,我没有Python方面的经验来帮助您。尝试通过此解决您的问题,如果您能够管理,请向我提供最新信息。确保在最后打电话给save。因此,如果您想更改
name
字段,例如,它类似于
self.name=#which#
,那么您可以进行保存,并且保存的方法签名在所有情况下都是相同的。进一步调查后,似乎Footprint对象的
save
方法已经被调用(这并不奇怪,因为有标准的Python继承)。因此不需要
super(…).save(…)
。如果您希望一次更改而不是覆盖所有save方法,这里的伙计们真的是一个很好的解决方案!