如何以最简洁高效的方式将特定模型实例的所有字段重置为其默认值?
如何以最简洁高效的方式将特定模型实例的所有字段重置为其默认值?
from django.db.models.fields import NOT_PROVIDED
for f in instance._meta.fields:
if f.default <> NOT_PROVIDED:
setattr(instance, f.name, f.default)
# treatment of None values, in your words, to handle fields not marked with null=True
...
...
# treatment ends
instance.save()
def reset( self, fields=[], exclude=[] ):
fields = fields or filter( lambda x: x.name in fields, self._meta.fields )
exclude.append( 'id' )
for f in filter( lambda x: x.name not in exclude, fields ):
if getattr( f, 'auto_now_add', False ):
continue
if f.blank or f.has_default():
setattr( self, f.name, f.get_default() )
这种方法主要适用于将单个值重置为默认值,但可以进行适应。它会重置所有我的Event
对象的rego_update
属性。
Event.objects.all().update(rego_update=Event().rego_update)
另外,如果要单独应用它(即触发自定义save
方法):
default = Event().rego_update # Hack to fetch the default
for event in Event.objects.all():
event.rego_update = default
event.save()
将 None
分配给字段,并保存。
通过检查.null
字段属性,将不可为空的所有字段都分配为None:
for name, value in {f.name: None for f in self._meta.fields if f.null}:
setattr(instance, name, value)
instance.save()
你可以使用 self.your_field = self.__class__._meta.get_field('your_field').default
。
请注意,根据你的 Django 版本,get_field
可能会有其他名称,因此请将其包装在 try/except 中。
在您对该实例进行更改之后,但在“保存”之前,我假设?我认为您可能需要从数据库中重新检索它... 我不认为Django模型实例会保留已对实例进行的更改的“历史记录”。
def reset(self):
new_instance = type(self)()
self.__dict__.update(new_instance.__dict__)
或者如果你想保留模型 ID:
def reset(self):
new_instance = type(self)(id=self.id)
self.__dict__.update(new_instance.__dict__)