สามารถส่งพจนานุกรมไปยังโมเดล django เมื่อสร้างได้หรือไม่


111

มันเป็นไปได้ที่จะทำบางสิ่งบางอย่างที่คล้ายกันนี้มีlist, dictionaryหรือสิ่งอื่นใด

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

ถ้าtitleและbodyมีสาขาในรูปแบบของคุณแล้วคุณสามารถส่งข้อโต้แย้งคำหลักในพจนานุกรมของคุณโดยใช้ผู้ประกอบการ **

สมมติว่าโมเดลของคุณถูกเรียกว่า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) คุณอาจรู้เรื่องนี้อยู่แล้ว แต่เพียงแค่แจ้งให้ทราบล่วงหน้า

4
ฉันไม่เคยใช้objects.createวิธีนี้มาก่อนคุณจึงสอนอะไรใหม่ ๆ ให้ฉัน
Alasdair

2
objects.create จะส่งกลับตัวชี้ไปยังโมเดลใหม่โดยเติม pk ที่ถูกต้องซึ่งหมายความว่าคุณสามารถใช้มันเพื่อสร้างโมเดลที่เกี่ยวข้องได้ทันที
Tom Leys

10
ฉันได้รับบิตโดยForeignKeys หากโมเดลของคุณถูกForeignKeyเรียกownerคุณdata_dictควรมีowner_idฟิลด์ แต่django.forms.model_to_dict()ส่งคืนคำสั่งด้วยownerฟิลด์ ดังนั้นคุณจึงไม่สามารถทำMyModel(**model_to_dict(my_instance)); คุณจะต้องเปลี่ยนชื่อสนามowner owner_id
cberzan

สิ่งสำคัญต่างประเทศ (การเพิ่ม _id) ไม่ได้ผลสำหรับฉันกับ 1.5.4 ฉันต้องทำอะไรบางอย่างมากขึ้นเช่น modelinstance.save (), modelinstance.add (Foreignobject.id) สำหรับความสัมพันธ์ MTM ขอบคุณมาก สิ่งนี้ช่วยให้ฉันทำงานได้ถูกต้อง
RobotHumans

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.