字典可以在创建时传递给Django模型吗?

149 投票
3 回答
88926 浏览
提问于 2025-04-15 15:05

有没有可能用一个 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')

3 个回答

0

这段话不是直接回答问题,但我发现这段代码对我创建字典很有帮助,这样可以把它们正确地保存到答案里。如果你要把这些数据导出为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 )
2

对于任何模型 DummyModel,你可以使用 DummyModel.objects.create(**data_dict) 这个方法来创建一个新的对象。这样做之后就不需要再单独调用保存的操作了。

287

如果你的模型里有 titlebody 这两个字段,那么你可以用 ** 操作符把字典里的关键字参数传递进去,具体可以参考这个链接:Python文档

假设你的模型叫 MyModel

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

至于你第二个问题,字典必须是最后一个参数。而且,extraextra2 也应该是模型里的字段。

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

撰写回答