Можно ли передать словарь в модели 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')
daaawx
источник

Ответы:

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. Это означает, что вы можете немедленно использовать его для построения связанных моделей.
Том Лейс,
10
Меня укусил ForeignKeyс. Если ваша модель имеет ForeignKeyвызываемый объект owner, тогда у вас data_dictдолжно быть owner_idполе. Но django.forms.model_to_dict()возвращает диктант с ownerполем. Так что вы не можете этого сделать MyModel(**model_to_dict(my_instance)); вы должны переименовать ownerполе в owner_id.
cberzan 02
Внешний ключ (добавление _id) у меня не работал с 1.5.4. Мне пришлось сделать что-то большее, например, modelinstance.save (), modelinstance.add (foreignobject.id) для отношения MTM. Спасибо хоть. Это действительно помогло мне встать на правильный путь, чтобы заставить его работать.
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 )
Люк Дюпен
источник