2010-07-12 8 views
6

Quale sarebbe il modo più elegante ed efficace per ripristinare tutti i campi di una determinata istanza di modello ai loro valori predefiniti?Django - Come reimpostare i campi del modello al loro valore predefinito?

+0

Penso di aver capito male la tua domanda - vuoi impostare ogni campo sul valore "predefinito" codificato per ogni oggetto di campo sul modello - o impostare ogni campo su ciò che era prima del valore del il campo è stato modificato? –

+1

@ Matthew - il priore. Se avessi voluto il secondo, ti farei il django-reversione. – Jonathan

risposta

1

Assegna None ai campi e salva.

+2

Non funzionerebbe solo in un sottoinsieme di situazioni? Ad esempio, potrebbe funzionare per i campi non contrassegnati con blank = True e null = True? – Jonathan

+1

Inserimenti di database o aggiornamenti di NULL vengono modificati nel valore predefinito del campo. –

+0

@ Jonathan Sono abbastanza sicuro che tu abbia ragione. Perché Django dovrebbe anche avere campi 'nulli = Veri 'se diventano solo valori predefiniti? – Mark

0

Dopo aver apportato modifiche a quell'istanza ma prima di averlo "salvato", presumo? Penso che probabilmente dovrai recuperarlo nuovamente dal database ... Non penso che le istanze del modello Django mantengano una "cronologia" delle modifiche apportate a un'istanza.

5

Una volta ho fatto così. Non c'è modo migliore di pensare.

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

Nota: Nel mio caso tutti i campi, ha avuto valore di default.

Spero che possa essere d'aiuto. Felice codifica.

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

Questo metodo è applicabile principalmente per reimpostare un valore singolo su un valore predefinito, ma può essere adattato. Reimposta la proprietà rego_update per tutti gli oggetti Event.

Event.objects.all().update(rego_update=Event().rego_update) 

In alternativa, da applicare singolarmente (cioè di innescare personalizzati save metodi):

default = Event().rego_update # Hack to fetch the default 
for event in Event.objects.all(): 
    event.rego_update = default 
    event.save() 

di adattare questo per ripristinare tutti i valori per una singola istanza, è possibile reimpostare manualmente ogni valore con un valore predefinito .

In alternativa, è possibile scorrere gli attributi in modo simile ad altre risposte qui, ma ciò avrà problemi con i campi che non hanno valore predefinito (o che non possono essere modificati).

Problemi correlati