¿Se puede pasar un diccionario a los modelos de django al crear?

111

¿Es posible hacer algo similar a esto con a list, dictionaryo algo más?

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

Model.objects.create(data_dict)

Incluso mejor si puedo extenderlo:

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

Respuestas:

211

Si titley bodyson campos en su modelo, entonces puede entregar los argumentos de palabras clave en su diccionario usando el operador ** .

Suponiendo que su modelo se llame MyModel:

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

En cuanto a su segunda pregunta, el diccionario tiene que ser el argumento final. Nuevamente, extray extra2deberían ser campos en el modelo.

m2 =MyModel(extra='hello', extra2='world', **data_dict)
m2.save()
Alasdair
fuente
12
Gracias, eso es exactamente lo que estaba buscando hacer. Además, como nota al margen basada en tu publicación. No tiene que llamar al método de guardar cuando usa Model.objects.create (** data_dict). Probablemente ya lo sepas, pero solo un aviso.
4
No he usado el objects.createmétodo antes, así que me has enseñado algo nuevo.
Alasdair
2
también objects.create devuelve un puntero al nuevo modelo, con un pk válido completado. Esto significa que puede usarlo inmediatamente para construir modelos relacionados.
Tom Leys
10
Me mordió la ForeignKeys. Si su modelo tiene una ForeignKeyllamada owner, entonces data_dictdebería tener un owner_idcampo. Pero django.forms.model_to_dict()devuelve un dict con un ownercampo. Entonces no puedes hacer MyModel(**model_to_dict(my_instance)); tienes que cambiar el nombre del ownercampo a owner_id.
cberzan
La clave externa (agregar _id) no me funcionó con 1.5.4. Tuve que hacer algo más como modelinstance.save (), modelinstance.add (foreignobject.id) para una relación MTM. Pero gracias. Esto realmente me ayudó a seguir el camino correcto para que funcione.
RobotHumans
0

No es una respuesta directa a la pregunta, pero encuentro que este código me ayudó a crear los dictados que guardan muy bien en la respuesta correcta. Las conversiones de tipo realizadas son necesarias si estos datos se exportarán a json.

Espero que esto ayude:

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