Kann ein Wörterbuch beim Erstellen an Django-Modelle übergeben werden?

111

Ist es möglich , etwas ähnliches wie dies mit einem tun list, dictionaryoder etwas anderes?

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

Model.objects.create(data_dict)

Noch besser, wenn ich es erweitern kann:

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

Antworten:

211

Wenn titleund bodyFelder in Ihrem Modell sind, können Sie die Schlüsselwortargumente in Ihrem Wörterbuch mit dem Operator ** angeben .

Angenommen, Ihr Modell heißt MyModel:

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

Bei Ihrer zweiten Frage muss das Wörterbuch das letzte Argument sein. Wieder extraund extra2sollte Felder im Modell sein.

m2 =MyModel(extra='hello', extra2='world', **data_dict)
m2.save()
Alasdair
quelle
12
Danke, genau das wollte ich tun. Auch als Randnotiz nur basierend auf Ihrem Beitrag. Sie müssen die Speichermethode nicht aufrufen, wenn Sie Model.objects.create (** data_dict) verwenden. Sie wissen das wahrscheinlich schon, aber nur einen Kopf hoch.
4
Ich habe die objects.createMethode noch nie benutzt , also hast du mir etwas Neues beigebracht.
Alasdair
2
Außerdem gibt objects.create einen Zeiger auf das neue Modell zurück, wobei ein gültiger pk ausgefüllt ist. Dies bedeutet, dass Sie ihn sofort zum Erstellen verwandter Modelle verwenden können.
Tom Leys
10
Ich wurde von ForeignKeys gebissen. Wenn Ihr Modell einen ForeignKeyAufruf hat owner, data_dictsollte Ihr owner_idFeld vorhanden sein. django.forms.model_to_dict()Gibt aber ein Diktat mit einem ownerFeld zurück. Also kannst du nicht tun MyModel(**model_to_dict(my_instance)); Sie müssen das ownerFeld in umbenennen owner_id.
Cberzan
Die Fremdschlüsselsache (Hinzufügen von _id) hat bei 1.5.4 bei mir nicht funktioniert. Ich musste für eine MTM-Beziehung etwas mehr wie modelinstance.save (), modelinstance.add (Foreignobject.id) tun. Trotzdem danke. Dies hat mir wirklich geholfen, den richtigen Weg zu finden, damit es funktioniert.
RobotHumans
0

Keine direkte Antwort auf die Frage, aber ich finde, dieser Code hat mir geholfen, die Diktate zu erstellen, die sich gut in die richtige Antwort einfügen. Die durchgeführten Typkonvertierungen sind erforderlich, wenn diese Daten nach json exportiert werden sollen.

Ich hoffe das hilft:

  #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 )
Luke Dupin
quelle