是否可以用 list
、dictionary
或其他东西做类似的事情?
data_dict = {
'title' : 'awesome title',
'body' : 'great body of text',
}
Model.objects.create(data_dict)
如果我可以扩展它,那就更好了:
Model.objects.create(data_dict, extra='hello', extra2='world')
如果 title
和 body
是模型中的字段,则 you can deliver the keyword arguments in your dictionary using the ** operator。
假设您的模型名为 MyModel
:
# create instance of model
m = MyModel(**data_dict)
# don't forget to save to database!
m.save()
至于你的第二个问题,字典必须是最后的论据。同样,extra
和 extra2
应该是模型中的字段。
m2 =MyModel(extra='hello', extra2='world', **data_dict)
m2.save()
对于任何模型 DummyModel
,您都可以使用 DummyModel.objects.create(**data_dict)
。创建后不需要保存。
不是直接回答这个问题,但我发现这段代码帮助我创建了可以很好地保存到正确答案中的字典。如果此数据将导出为 json,则需要进行类型转换。
我希望这有帮助:
#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 )
不定期副业成功案例分享
objects.create
方法,所以你教会了我一些新东西。ForeignKey
咬了。如果您的模型有一个名为owner
的ForeignKey
,那么您的data_dict
应该有一个owner_id
字段。但是django.forms.model_to_dict()
返回一个带有owner
字段的字典。所以你不能做MyModel(**model_to_dict(my_instance))
;您必须将owner
字段重命名为owner_id
。