Può un dizionario di essere passato a django modelli a creare?

È possibile fare qualcosa di simile a questo con un list, dictionary o qualcos’altro?

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

Model.objects.create(data_dict)

Ancora meglio se posso estenderla:

Model.objects.create(data_dict, extra='hello', extra2='world')
InformationsquelleAutor | 2009-10-15



2 Replies
  1. 183

    Se title e body sono i campi del modello, quindi si può consegnare la parola chiave di argomenti nel dizionario utilizzando i ** operatore.

    Supponendo che il tuo modello è chiamato MyModel:

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

    Per la tua seconda domanda, il dizionario è un ultimo argomento. Di nuovo, extra e extra2 dovrebbero essere i campi nel modello.

    m2 =MyModel(extra='hello', extra2='world', **data_dict)
    m2.save()
    • Grazie, è esattamente quello che stavo cercando di fare. Inoltre, come nota a margine, solo in base a un tuo post. Non è necessario chiamare il metodo di salvataggio quando si utilizza il Modello.oggetti.creare(**data_dict). Probabilmente già lo sapete, ma solo un testa a testa.
    • Non ho usato il objects.create metodo di prima, così mi hai insegnato qualcosa di nuovo.
    • anche gli oggetti.creare restituisce un puntatore al nuovo modello, con un valido pk compilato. Questo significa che è possibile utilizzare immediatamente per costruire i modelli correlati.
    • Ho avuto bit da ForeignKeys. Se il tuo modello ha una ForeignKey chiamato owner, allora il vostro data_dict dovrebbe avere un owner_id campo. Ma django.forms.model_to_dict() restituisce un dict con un owner campo. Così non si può fare MyModel(**model_to_dict(my_instance)); è necessario rinominare la owner campo owner_id.
    • La chiave esterna cosa (con l’aggiunta di _id) non ha funzionato per me con 1.5.4. Ho dovuto fare qualcosa di più come modelinstance.save(), modelinstance.aggiungere(oggettoesterno.id) per l’MTM relazione. Grazie comunque. Questo davvero mi ha aiutato a ottenere sulla strada giusta per ottenere il lavoro.
    • Che è un buon punto su model_to_dict denominazione di chiavi. Io uso dict di un modello (m2.__dict__, i tasti sono denominati correttamente e non aggiungere cose che si possono/maynot desidera. Nota: ci sono alcuni campi nascosti si desidera rimuovere, tutti inizio con un’ _

  2. 0

    Non direttamente una risposta alla domanda, ma ho trovato questo codice che mi ha aiutato a creare il dicts che salva benissimo la risposta corretta. Il tipo di conversioni fatte sono necessari se questi dati potranno essere esportati in formato json.

    Spero che questo aiuta:

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

Lascia un commento