2009-10-15 12 views

Odpowiedz

143

Jeśli title i body są pola w modelu, potem you can deliver the keyword arguments in your dictionary using the ** operator.

Zakładając model nazywa MyModel:

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

Co do drugiego pytania, słownik musi być ostatecznym argumentem. Ponownie, extra i extra2 powinny być polami w modelu.

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

Dzięki, to jest dokładnie to, czego szukałem do zrobienia. Ponadto, jako notatkę po prostu opiera się na swoim poście. Nie musisz wywoływać metody składowania podczas używania Model.objects.create (** data_dict). Prawdopodobnie już to wiesz, ale tylko heads-up. –

+3

Nie użyłem wcześniej metody 'objects.create', więc nauczyłeś mnie czegoś nowego. – Alasdair

+2

również objects.create zwraca wskaźnik do nowego modelu, z poprawnym wypełnionym pk. Oznacza to, że możesz od razu użyć go do zbudowania podobnych modeli. –

1

Nie bezpośrednio odpowiedź na pytanie, ale uważam, że ten kod pomógł mi stworzyć dyktando, które ładnie zapisuje poprawną odpowiedź. Konwersje typów są wymagane, jeśli dane zostaną wyeksportowane do json.

Mam nadzieję, że to pomoże:

#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)