È 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.