Can a dictionary be passed to django models on create?

后端 未结 2 460
渐次进展
渐次进展 2020-12-04 05:42

Is it possible to do something similar to this with a list, dictionary or something else?

data_dict = {
    \'title\' : \'awesome t         


        
相关标签:
2条回答
  • 2020-12-04 06:30

    If title and body are fields in your model, then you can deliver the keyword arguments in your dictionary using the ** operator.

    Assuming your model is called MyModel:

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

    As for your second question, the dictionary has to be the final argument. Again, extra and extra2 should be fields in the model.

    m2 =MyModel(extra='hello', extra2='world', **data_dict)
    m2.save()
    
    0 讨论(0)
  • 2020-12-04 06:35

    Not directly an answer to the question, but I find this code helped me create the dicts that save nicely into the correct answer. The type conversions made are required if this data will be exported to json.

    I hope this helps:

      #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 )
    
    0 讨论(0)
提交回复
热议问题