Bisakah kamus diteruskan ke model django saat dibuat?

111

Apakah mungkin untuk melakukan sesuatu yang serupa dengan ini dengan list, dictionaryatau sesuatu yang lain?

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

Model.objects.create(data_dict)

Lebih baik lagi jika saya bisa memperpanjangnya:

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

Jawaban:

211

Jika titledan bodyare dalam model Anda, maka Anda dapat menyampaikan argumen kata kunci dalam kamus Anda menggunakan operator ** .

Dengan asumsi model Anda dipanggil MyModel:

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

Untuk pertanyaan kedua Anda, kamus harus menjadi argumen terakhir. Sekali lagi, extradan extra2harus menjadi bidang dalam model.

m2 =MyModel(extra='hello', extra2='world', **data_dict)
m2.save()
Alasdair
sumber
12
Terima kasih, itulah yang ingin saya lakukan. Juga, sebagai catatan tambahan hanya berdasarkan posting Anda. Anda tidak perlu memanggil metode penyimpanan saat menggunakan Model.objects.create (** data_dict). Anda mungkin sudah mengetahui hal ini, tetapi hanya informasi sebelumnya.
4
Saya belum pernah menggunakan objects.createmetode ini sebelumnya, jadi Anda telah mengajari saya sesuatu yang baru.
Alasdair
2
juga object.create mengembalikan pointer ke model baru, dengan pk yang valid terisi. Ini berarti Anda dapat segera menggunakannya untuk membangun model terkait.
Tom Leys
10
Saya mendapat sedikit demi sedikit ForeignKey. Jika model Anda telah sebuah ForeignKeydisebut owner, maka Anda data_dictharus memiliki owner_idlapangan. Tapi django.forms.model_to_dict()mengembalikan sebuah dict dengan sebuah ownerfield. Jadi Anda tidak bisa melakukannya MyModel(**model_to_dict(my_instance)); Anda harus mengganti nama ownerbidang menjadi owner_id.
cberzan
Hal kunci asing (menambahkan _id) tidak berfungsi untuk saya dengan 1.5.4. Saya harus melakukan sesuatu yang lebih seperti modelinstance.save (), modelinstance.add (foreignobject.id) untuk relasi MTM. Terimakasih Meskipun. Ini sangat membantu saya mendapatkan jalur yang benar untuk membuatnya bekerja.
RobotHumans
0

Bukan langsung jawaban atas pertanyaan, tetapi saya menemukan kode ini membantu saya membuat dicts yang menyimpan dengan baik ke dalam jawaban yang benar. Jenis konversi yang dibuat diperlukan jika data ini akan diekspor ke json.

Saya harap ini membantu:

  #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 )
Luke Dupin
sumber