Có thể chuyển từ điển cho các mô hình django khi tạo không?


111

Là nó có thể làm điều gì đó tương tự như điều này với một list, dictionaryhay cái gì khác?

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

Model.objects.create(data_dict)

Thậm chí tốt hơn nếu tôi có thể mở rộng nó:

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

Câu trả lời:


211

Nếu titlebodylà các trường trong mô hình của bạn, thì bạn có thể cung cấp các đối số từ khóa trong từ điển của mình bằng toán tử ** .

Giả sử mô hình của bạn được gọi là MyModel:

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

Đối với câu hỏi thứ hai của bạn, từ điển phải là đối số cuối cùng. Một lần nữa, extraextra2phải là các trường trong mô hình.

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

12
Cảm ơn, đó chính xác là những gì tôi muốn làm. Ngoài ra, như một ghi chú phụ chỉ dựa trên bài đăng của bạn. Bạn không phải gọi phương thức lưu khi sử dụng Model.objects.create (** data_dict). Bạn có thể đã biết điều này nhưng chỉ cần lưu ý.

4
Tôi đã không sử dụng objects.createphương pháp này trước đây, vì vậy bạn đã dạy tôi điều gì đó mới.
Alasdair

2
cũng objects.create trả về một con trỏ đến mô hình mới, với pk hợp lệ được điền vào. Điều này có nghĩa là bạn có thể sử dụng nó ngay lập tức để xây dựng các mô hình liên quan.
Tom Leys

10
Tôi đã từng chút ForeignKeymột. Nếu mô hình của bạn có một lệnh ForeignKeygọi owner, thì bạn data_dictphải có một owner_idtrường. Nhưng django.forms.model_to_dict()trả về một dict với một ownertrường. Vì vậy, bạn không thể làm MyModel(**model_to_dict(my_instance)); bạn phải đổi tên ownertrường thành owner_id.
cberzan

Khóa ngoại (thêm _id) không hoạt động với tôi với 1.5.4. Tôi đã phải làm một cái gì đó giống như modelinstance.save (), modelinstance.add (externalnobject.id) cho mối quan hệ MTM. Xin cảm ơn. Điều này thực sự đã giúp tôi đi đúng hướng để làm cho nó hoạt động.
RobotHumans

0

Không trực tiếp là câu trả lời cho câu hỏi, nhưng tôi thấy mã này đã giúp tôi tạo ra các phân số lưu độc đáo thành câu trả lời chính xác. Các chuyển đổi loại được thực hiện là bắt buộc nếu dữ liệu này sẽ được xuất sang json.

Tôi hi vọng cái này giúp được:

  #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 )
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.