생성시 딕셔너리를 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

경우 titlebody모델의 필드는 다음 당신은 ** 연산자를 사용하여 사전에 키워드 인수를 제공 할 수 있습니다 .

모델이 호출되었다고 가정합니다 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)를 사용할 때 save 메서드를 호출 할 필요가 없습니다. 당신은 아마 이것을 이미 알고 있지만 단지주의 할 것입니다.

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에서 작동하지 않았습니다. MTM 관계를 위해 modelinstance.save (), modelinstance.add (foreignobject.id)와 같은 것을해야했습니다. 그래도 고마워. 이것은 제가 제대로 작동하는 데 도움이되었습니다.
RobotHumans

0

질문에 대한 직접적인 답은 아니지만이 코드가 정답에 멋지게 저장되는 dicts를 만드는 데 도움이되었습니다. 이 데이터를 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.