Respuestas:
Si title
y body
son 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, extra
y extra2
deberían ser campos en el modelo.
m2 =MyModel(extra='hello', extra2='world', **data_dict)
m2.save()
objects.create
método antes, así que me has enseñado algo nuevo.
ForeignKey
s. Si su modelo tiene una ForeignKey
llamada owner
, entonces data_dict
debería tener un owner_id
campo. Pero django.forms.model_to_dict()
devuelve un dict con un owner
campo. Entonces no puedes hacer MyModel(**model_to_dict(my_instance))
; tienes que cambiar el nombre del owner
campo a owner_id
.
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 )