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方法,这里的伙计们真的是一个很好的解决方案!