作成時に辞書を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')

回答:


211

場合titlebodyモデル内のフィールドがあり、その後、あなたは**演算子を使用して、辞書にキーワード引数を提供することができます

モデルが呼び出されていると仮定しますMyModel

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

2番目の質問については、辞書が最後の引数でなければなりません。ここでも、extraおよびextra2モデル内のフィールドでなければなりません。

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

12
ありがとう、それがまさに私が探していたものです。また、あなたの投稿を基にした付記として。Model.objects.create(** data_dict)を使用する場合は、saveメソッドを呼び出す必要はありません。あなたはおそらくこれをすでに知っていますが、ただの前兆です。

4
私はobjects.create以前にその方法を使用したことがないので、あなたは私に何か新しいことを教えました。
Alasdair、

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 2012年

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 )
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.