¿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')

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

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 )
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.