2010-07-12 141 views
6

将某个模型实例的所有字段重置为其默认值的最优雅\有效的方法是什么?Django - 如何将模型字段重置为默认值?

+0

我想我可能误解了您的问题 - 您是否想将每个字段设置为模型上为每个字段对象编码的“默认”值 - 或者将每个字段设置回原来的值字段被修改? – 2010-07-12 15:22:38

+1

@Matthew - 之前。如果我想要后者,我会让你django回归。 – Jonathan 2010-07-12 15:26:42

回答

1

分配None到田间地头,并保存。

+2

这不仅仅适用于一些情况吗?例如,它是否适用于未标记为空= True和空= True的字段? – Jonathan 2010-07-12 15:29:45

+1

将NULL的数据库插入或更新更改为该字段的默认值。 – 2010-07-12 15:43:39

+0

@Jonathan我很确定你是对的。为什么如果Django只是默认值,甚至会有'null = True'字段? – Mark 2015-03-17 22:09:18

0

你改变了一个实例,但你“保存”之前后,我承担?我认为你可能需要从数据库中重新检索它......我不认为Django模型实例会对实例发生的变化保留一个“历史记录”。

5

我曾经这样做过。没有更好的办法可以想到。

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() 

注意:在我的情况下,所有的字段,都有默认值。

希望它会有所帮助。快乐编码。

3
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()) 
0

此方法主要适用于将单个值重置为默认值,但可以进行调整。它会重置所有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() 

为了适应这种重置所有值的单个实例,你可以手动复位每个值与默认。

或者,你可以通过类似于这里其他的答案的属性环路,但这将有没有预设(或不能编辑)领域的问题。

相关问题