web-dev-qa-db-ja.com

辞書をDjango createのモデルに渡すことはできますか?

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')
102
clarence

titlebodyがモデル内のフィールドである場合、- **​​演算子を使用して辞書にキーワード引数を渡すことができます

モデルがMyModelと呼ばれると仮定します:

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

2番目の質問に関しては、辞書が最後の引数でなければなりません。再び、extraextra2はモデル内のフィールドでなければなりません。

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

質問に対する直接的な答えではありませんが、このコードは正しい答えにうまく保存する辞書を作成するのに役立ちました。このデータを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 )
0
Luke Dupin