Oluşturma sırasında django modellerine sözlük aktarılabilir mi?


111

Bir ile buna benzer bir şey yapmak mümkün mü list, dictionaryyoksa başka bir şey?

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

Model.objects.create(data_dict)

Uzatabilirsem daha da iyi:

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

Yanıtlar:


211

Eğer titleve bodyModelinizdeki alanlardır sonra sen ** operatörünü kullanarak sözlükte kelime argümanlar sunabilirsiniz .

Modelinizin çağrıldığını varsayarsak MyModel:

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

İkinci sorunuza gelince, sözlük son argüman olmalıdır. Yine extrave extra2modeldeki alanlar olmalıdır.

m2 =MyModel(extra='hello', extra2='world', **data_dict)
m2.save()

12
Teşekkürler, tam da yapmak istediğim buydu. Ayrıca, yalnızca gönderinize dayalı bir yan not olarak. Model.objects.create (** data_dict) kullanırken kaydetme yöntemini çağırmanız gerekmez. Muhtemelen bunu zaten biliyorsunuzdur, ancak sadece bir uyarı.

4
Bu objects.createyöntemi daha önce kullanmadım, bu yüzden bana yeni bir şey öğrettin.
Alasdair

2
ayrıca objects.create, yeni modele, doldurulmuş geçerli bir pk ile bir işaretçi döndürür. Bu, ilgili modelleri oluşturmak için onu hemen kullanabileceğiniz anlamına gelir.
Tom Leys

10
Ben ısırdım ForeignKey. Modelinizde bir ForeignKeyçağrı varsa owner, o zaman bir alanınız data_dictolmalıdır owner_id. Ancak alan django.forms.model_to_dict()içeren bir dikte döndürür owner. Yani yapamazsınız MyModel(**model_to_dict(my_instance)); owneralanı olarak yeniden adlandırmanız gerekir owner_id.
cberzan 02

Yabancı anahtar şeyi (_id ekleyerek) 1.5.4 ile benim için çalışmadı. MTM ilişkisi için modelinstance.save (), modelinstance.add (foreignobject.id) gibi bir şey yapmam gerekiyordu. Yine de teşekkürler. Bu gerçekten doğru yolda ilerlememe yardımcı oldu.
RobotHumans

0

Doğrudan sorunun cevabı değil, ama bu kodun doğru cevaba güzelce tasarruf sağlayan sözler oluşturmama yardımcı olduğunu gördüm. Bu veriler json'a aktarılacaksa, yapılan tür dönüştürmeleri gereklidir.

Umarım bu yardımcı olur:

  #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 )
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.