default models - Come ottengo il valore predefinito per un campo in un modello Django?




all field (5)

Ho un modello Django con alcuni campi con valori predefiniti specificati. Sto cercando di prendere il valore predefinito per uno di questi campi per noi più avanti nel mio codice. C'è un modo semplice per prendere il valore predefinito di un particolare campo da un modello?


Answers

TheModel._meta.get_field('the_field').get_default()

Se sono necessari i valori predefiniti per più di un campo (ad esempio in una sorta di fase di reinizializzazione), può valere la pena semplicemente istanziare un nuovo oggetto temporaneo del modello e utilizzare i valori dei campi da tale oggetto.

temp_obj = MyModel()
obj.field_1 = temp_obj.field_1 if cond_1 else 'foo'
...
obj.field_n = temp_obj.field_n if cond_n else 'bar'

Ovviamente ne vale la pena, se l'oggetto temporaneo può essere costruito senza ulteriori problemi di prestazioni / dipendenza.


Puoi ottenere il campo in questo modo:

myfield = MyModel._meta.get_field_by_name('field_name')

e il valore predefinito è solo un attributo del campo:

myfield.default

A partire da Django 1.9.x puoi usare:

field = TheModel._meta.get_field('field_name')
default_value = field.get_default()

Ecco un altro approccio utilizzando un metodo di modello. Questa versione risolve i campi di selezione / scelta, salta i campi vuoti e consente di escludere campi specifici.

def get_all_fields(self):
    """Returns a list of all field names on the instance."""
    fields = []
    for f in self._meta.fields:

        fname = f.name        
        # resolve picklists/choices, with get_xyz_display() function
        get_choice = 'get_'+fname+'_display'
        if hasattr(self, get_choice):
            value = getattr(self, get_choice)()
        else:
            try:
                value = getattr(self, fname)
            except AttributeError:
                value = None

        # only display fields with values and skip some fields entirely
        if f.editable and value and f.name not in ('id', 'status', 'workshop', 'user', 'complete') :

            fields.append(
              {
               'label':f.verbose_name, 
               'name':f.name, 
               'value':value,
              }
            )
    return fields

Quindi nel tuo modello:

{% for f in app.get_all_fields %}
  <dt>{{f.label|capfirst}}</dt>
    <dd>
      {{f.value|escape|urlize|linebreaks}}
    </dd>
{% endfor %}




django model default