Чи можна передавати словник моделям 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
Також object.create повертає вказівник на нову модель із заповненим дійсним ПК. Це означає, що ви можете негайно використовувати його для створення відповідних моделей.
Том Лейс

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 )
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.