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.