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


111

是否有可能做类似这样的一个东西listdictionary还是其他什么东西?

data_dict = {
    'title' : 'awesome title',
    'body' : 'great body of text',
}

Model.objects.create(data_dict)

如果我可以扩展它,那就更好了:

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

Answers:


211

如果titlebody是模型中的字段,则可以使用**运算符将关键字参数传递到字典中

假设您的模型称为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()

12
谢谢,这正是我想要做的。另外,请注意,仅基于您的帖子。使用Model.objects.create(** data_dict)时不必调用save方法。您可能已经知道这一点,但请注意。

4
我以前没有使用过这种objects.create方法,所以您教了我一些新知识。
阿拉斯戴尔

2
另外objects.create返回指向新模型的指针,并填充了有效的pk。这意味着您可以立即使用它来构建相关模型。
汤姆·莱斯

10
我一点点ForeignKey。如果您的模型有一个ForeignKey被叫owner,那么您data_dict应该有一个owner_id字段。但是django.forms.model_to_dict()返回带有owner字段的字典。所以你不能做MyModel(**model_to_dict(my_instance)); 您必须将owner字段重命名为owner_id
cberzan

对于1.5.4,外键(添加_id)对我不起作用。对于MTM关系,我不得不做更多类似modelinstance.save(),modelinstance.add(foreignobject.id)的事情。不过谢谢 这确实帮助我走上了正确的轨道,使其得以正常运转。
RobotHumans 2013年

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 )
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.