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

Posted

技术标签:

【中文标题】字典可以在创建时传递给 django 模型吗?【英文标题】:Can a dictionary be passed to django models on create? 【发布时间】:2010-12-06 23:50:15 【问题描述】:

是否可以用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')

【问题讨论】:

【参考方案1】:

对于任何型号DummyModel,您都可以使用DummyModel.objects.create(**data_dict)。创建后不需要保存。

【讨论】:

【参考方案2】:

不是问题的直接答案,但我发现这段代码帮助我创建了可以很好地保存到正确答案中的字典。如果此数据将导出为 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 )

【讨论】:

【参考方案3】:

如果 titlebody 是模型中的字段,则 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()

至于你的第二个问题,字典必须是最后的论据。同样,extraextra2 应该是模型中的字段。

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

【讨论】:

谢谢,这正是我想要做的。另外,作为旁注,仅基于您的帖子。使用 Model.objects.create(**data_dict) 时不必调用 save 方法。您可能已经知道这一点,但只是提醒一下。 我以前没用过objects.create 方法,所以你教会了我一些新东西。 还有objects.create返回一个指向新模型的指针,并填写了一个有效的pk。这意味着您可以立即使用它来构建相关模型。 我被ForeignKeys 咬了。如果您的模型有一个名为ownerForeignKey,那么您的data_dict 应该有一个owner_id 字段。但是django.forms.model_to_dict() 返回一个带有owner 字段的字典。所以你不能做MyModel(**model_to_dict(my_instance));您必须将 owner 字段重命名为 owner_id 在 1.5.4 中外键(添加 _id)对我不起作用。对于 MTM 关系,我不得不做一些更像 modelinstance.save()、modelinstance.add(foreignobject.id) 的事情。不过谢谢。这真的帮助我走上了正确的轨道,让它发挥作用。

以上是关于字典可以在创建时传递给 django 模型吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 模型上存储字典?

Django - 将模型名称从 url 传递给视图

Django 将多个模型传递给一个模板

根据用户输入从 django 模型中选择对象

Django将多个模型传递给模板

django 有没有内置用字典更新模型的方法