2010-07-12 4 views
6

Что было бы самым элегантным \ эффективным способом сбросить все поля экземпляра определенной модели до значения по умолчанию?Django - Как сбросить поля модели до значения по умолчанию?

+0

Я думаю, что я, возможно, неправильно понял ваш вопрос: хотите ли вы установить каждое поле в значение «по умолчанию», закодированное для каждого объекта поля на модели, или установить каждое поле обратно до того, что было до значения поле было изменено? –

+1

@Matthew - предыдущий. Если бы я хотел получить последний, я бы сделал django-reversion. – Jonathan

ответ

1

Присвойте None в поле и сохраните.

+2

Разве это не работает только в подмножестве ситуаций? Например, будет ли он работать для полей, не отмеченных пустым = True и null = True? – Jonathan

+1

Вставки или обновления базы данных NULL изменяются на значение по умолчанию для поля. –

+0

@ Джонатан. Я уверен, что ты прав. Почему Django даже имеет поля «null = True», если они просто становятся значениями по умолчанию? – Mark

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

Этот метод применяется в основном для сброса значения по умолчанию, но может быть адаптирован. Он сбрасывает свойство rego_update для всех моих Event объектов.

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

Чтобы адаптировать для сброса всех значений для одного экземпляра, вы можете вручную сбросить каждое значение по умолчанию ,

В качестве альтернативы вы можете прокрутить атрибуты, подобные другим ответам здесь, но это будет иметь проблемы с полями, которые не имеют значения по умолчанию (или не могут быть отредактированы).

Смежные вопросы