Can a dictionary be passed to django models on create?

Is it possible to do something similar to this with a list, dictionary or something else?

data_dict = { 'title' : 'awesome title', 'body' : 'great body of text',
}
Model.objects.create(data_dict)

Even better if I can extend it:

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

3 Answers

If title and body are fields in your model, then you can deliver the keyword arguments in your dictionary using the ** operator.

Assuming your model is called MyModel:

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

As for your second question, the dictionary has to be the final argument. Again, extra and extra2 should be fields in the model.

m2 =MyModel(extra='hello', extra2='world', **data_dict)
m2.save()
8

For any model DummyModel you can use DummyModel.objects.create(**data_dict). Does not require save after the create.

Not directly an answer to the question, but I find this code helped me create the dicts that save nicely into the correct answer. The type conversions made are required if this data will be exported to json.

I hope this helps:

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

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like