È possibile passare un dizionario ai modelli django durante la creazione?


111

È possibile fare qualcosa di simile a questo con a list, dictionaryo qualcos'altro?

data_dict = {
    'title' : 'awesome title',
    'body' : 'great body of text',
}

Model.objects.create(data_dict)

Ancora meglio se posso estenderlo:

Model.objects.create(data_dict, extra='hello', extra2='world')

Risposte:


211

Se titlee bodysono campi nel tuo modello, puoi fornire gli argomenti della parola chiave nel tuo dizionario utilizzando l'operatore ** .

Supponendo che il tuo modello si chiami MyModel:

# create instance of model
m = MyModel(**data_dict)
# don't forget to save to database!
m.save()

Per quanto riguarda la tua seconda domanda, il dizionario deve essere l'ultimo argomento. Ancora una volta, extrae extra2dovrebbero essere i campi nel modello.

m2 =MyModel(extra='hello', extra2='world', **data_dict)
m2.save()

12
Grazie, è esattamente quello che stavo cercando di fare. Inoltre, come nota a margine solo basata sul tuo post. Non è necessario chiamare il metodo di salvataggio quando si utilizza Model.objects.create (** data_dict). Probabilmente lo sai già, ma solo un avvertimento.

4
Non ho usato il objects.createmetodo prima, quindi mi hai insegnato qualcosa di nuovo.
Alasdair

2
anche objects.create restituisce un puntatore al nuovo modello, con un pk valido riempito. Ciò significa che puoi usarlo immediatamente per costruire modelli correlati.
Tom Leys

10
Sono stato morso da ForeignKeys. Se il tuo modello ha una ForeignKeychiamata owner, allora data_dictdovresti avere un owner_idcampo. Ma django.forms.model_to_dict()restituisce un dict con un ownercampo. Quindi non puoi farlo MyModel(**model_to_dict(my_instance)); devi rinominare il ownercampo in owner_id.
cberzan

La chiave esterna (aggiunta di _id) non ha funzionato per me con 1.5.4. Ho dovuto fare qualcosa di più come modelinstance.save (), modelinstance.add (Foreignobject.id) per una relazione MTM. Grazie comunque. Questo mi ha davvero aiutato a prendere la strada giusta per farlo funzionare.
RobotHumans

0

Non direttamente una risposta alla domanda, ma trovo che questo codice mi abbia aiutato a creare i dict che si salvano bene nella risposta corretta. Le conversioni di tipo effettuate sono necessarie se questi dati verranno esportati in json.

Spero che aiuti:

  #mod is a django database model instance
def toDict( mod ):
  import datetime
  from decimal import Decimal
  import re

    #Go through the object, load in the objects we want
  obj = {}
  for key in mod.__dict__:
    if re.search('^_', key):
      continue

      #Copy my data
    if isinstance( mod.__dict__[key], datetime.datetime ):
      obj[key] = int(calendar.timegm( ts.utctimetuple(mod.__dict__[key])))
    elif isinstance( mod.__dict__[key], Decimal ):
      obj[key] = float( mod.__dict__[key] )
    else:
      obj[key] = mod.__dict__[key]

  return obj 

def toCsv( mod, fields, delim=',' ):
  import datetime
  from decimal import Decimal

    #Dump the items
  raw = []
  for key in fields:
    if key not in mod.__dict__:
      continue

      #Copy my data
    if isinstance( mod.__dict__[key], datetime.datetime ):
      raw.append( str(calendar.timegm( ts.utctimetuple(mod.__dict__[key]))) )
    elif isinstance( mod.__dict__[key], Decimal ):
      raw.append( str(float( mod.__dict__[key] )))
    else:
      raw.append( str(mod.__dict__[key]) )

  return delim.join( raw )
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.