2009-07-14 39 views
57

Nếu bạn đến đây từ Google tìm kiếm mô hình để dict, bỏ qua câu hỏi của tôi và chỉ cần chuyển xuống câu trả lời đầu tiên. Câu hỏi của tôi sẽ chỉ gây nhầm lẫn cho bạn.Django: Chuyển đổi toàn bộ một đối tượng của Mô hình thành một từ điển

Có cách nào tốt trong Django để đặt toàn bộ các đối tượng của Mô hình thành một từ điển không? Ý tôi là, như thế này:

class DictModel(models.Model): 
    key = models.CharField(20) 
    value = models.CharField(200) 


DictModel.objects.all().to_dict() 

... với kết quả là từ điển với cặp khóa/giá trị được tạo thành từ các bản ghi trong Mô hình? Có ai khác nhìn thấy điều này như là hữu ích cho họ?

Cảm ơn.

Cập nhật
Tôi chỉ muốn thêm là mục tiêu cuối cùng của tôi là có thể thực hiện tra cứu biến đơn giản bên trong Mẫu. Một cái gì đó như:

{{ DictModel.exampleKey }} 

Với kết quả của DictModel.objects.get (key__exact = exampleKey) .Value

Nhìn chung, tuy nhiên, các bạn đã thực sự làm tôi ngạc nhiên với cách hữu ích allof phản ứng của bạn, và làm thế nào các cách tiếp cận nó có thể khác nhau. Cảm ơn rất nhiều.

Cập nhật tháng 10 năm 2011: Câu hỏi này là kết quả hàng đầu nếu bạn Google "django model_to_dict", mà thực sự là khá khủng khiếp cho rằng nó giải quyết một vấn đề khác với những gì tôi đã yêu cầu.

Điều tôi muốn là có thể ánh xạ tất cả các cá thể trong bộ truy vấn vào một từ điển duy nhất với trường mô hình được chỉ định làm khóa. Mặt khác,
mô hình_to_dict chuyển đổi một cá thể mô hình thành một từ điển.

Hiện tại, nhu cầu của tôi vào thời điểm đó khá cụ thể và có thể rất hiếm (tôi thậm chí không thể nhớ dự án tôi cần nó cho hoặc tại sao). Vì vậy, tôi sẽ khá ngạc nhiên rằng bất cứ ai tìm kiếm thông tin về model_to_dict sẽ tìm thấy câu hỏi của tôi thực sự hữu ích. Lấy làm tiếc.

model_to_dict có vẻ là trường hợp sử dụng phổ biến hơn nhiều so với tôi có.

Cập nhật tháng 12 năm 2011:
Tôi đã thay đổi tiêu đề để hy vọng phản ánh tốt hơn dự định ban đầu của tôi.

+1

Nếu bạn đang tìm kiếm cách để chuyển đổi mô hình django duy nhất để một cuốn từ điển, vui lòng vào đây: http://stackoverflow.com/q/21925671/2800876 – Zags

+0

'list_of_json = [model_to_dict (mô hình) cho mô hình trong list_of_models]' – FreshPow

Trả lời

17

Điều này có cần phải tạo ra một thực tế không? bạn có thể nhận được bằng chỉ một cái gì đó trông giống như một dict?

class DictModelAdaptor(): 
    def __init__(self, model): 
     self.model = model 

    def __getitem__(self, key): 
     return self.model.objects.get(key=key) 

    def __setitem__(self, key, item): 
     pair = self.model() 
     pair.key = key 
     pair.value = item 
     pair.save() 

    def __contains__(self, key): 
     ... 

Sau đó, bạn có thể quấn một mô hình theo cách này:

modelDict = DictModelAdaptor(DictModel) 
modelDict["name"] = "Bob Jones" 

vv ...

+0

Nếu điều này làm việc trong tra cứu biến mẫu, điều này thực sự có thể là những gì tôi muốn. Bạn đã thử cái này chưa? Nó sẽ là một vài giờ trước khi tôi có thể. – LarrikJ

+0

Có, tôi đã sử dụng bộ điều hợp container trong nhiều trường hợp, mặc dù tôi chắc chắn không muốn sử dụng toàn bộ mô hình theo cách này. Cũng xin lưu ý rằng ví dụ này có phần viết tắt. Bạn sẽ muốn thêm một số trình xử lý bổ sung và xử lý lỗi thích hợp. – SingleNegationElimination

+0

Tôi đã chọn câu trả lời này bởi vì nó phù hợp với tình hình cụ thể của tôi tốt nhất (đó là một chút phức tạp hơn một tình huống hơn tôi mô tả). Các câu trả lời khác là tuyệt vời, và làm việc tốt là tốt. Phần yêu thích của tôi là lần tra cứu được thực hiện từng lần một, thay vì tải toàn bộ bảng cùng một lúc. Tôi thậm chí không nhận ra tôi muốn điều đó cho đến khi tôi nhìn thấy nó. – LarrikJ

26

Bạn đang tìm kiếm Values member of QuerySet cho phép bạn để có được một danh sách các từ điển từ truy vấn

của bạn Trả về một ValuesQuerySet - một QuerySet để định ra một danh sách các từ điển thay vì mô hình thẩm các đối tượng. Mỗi từ điển đó đại diện cho một đối tượng, với các phím tương ứng đến tên thuộc tính của mô hình đối tượng.

>>> Blog.objects.values() 
[{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}], 
>>> Blog.objects.values('id', 'name') 
[{'id': 1, 'name': 'Beatles Blog'}] 
+0

Tôi không nghĩ rằng anh ta muốn danh sách dict, anh ta muốn một dict duy nhất mà khóa là chìa khóa mô hình –

5

sử dụng

dict(((m.key, m.value) for m in DictModel.objects.all()) 

Theo đề nghị của Tom Leys, chúng tôi không cần phải nhận được toàn bộ đối tượng, chúng ta có thể chỉ nhận được những giá trị chúng ta cần ví dụ

dict(((m['key'], m['value']) for m in DictModel.objects.values('key', 'value'))) 

và nếu bạn cần tất cả các giá trị, tốt hơn là giữ toàn bộ đối tượng trong dict, ví dụ:

dict(((m.key, m) for m in DictModel.objects.all()) 
+1

Chúng ta nên kết hợp các giải pháp - dict (((m [ 'key'], m ['value']) cho m trong DictModel.objects.all(). values ​​()) - theo cách này, trường id ẩn không được trả về từ DB. –

+0

ok Tôi sẽ cập nhật solutio của mình n, bạn có thể làm của bạn :) –

14

Bạn có thể sử dụng pythonserializer:

from django.core import serializers 
data = serializers.serialize('python', DictModel.objects.all()) 
+0

Tôi chưa thử serializers của Django, vì vậy tôi đang gặp khó khăn trong việc tìm ra cách làm việc này. Tôi nghĩ rằng tôi sẽ cần phải thử ý tưởng này trong một phiên tương tác. Nó có vẻ như nó có thể là một giải pháp, mặc dù. Cảm ơn. – LarrikJ

+1

django 'serializers' có thể làm serializations thành' queryset', trong khi 'model_to_dict' chỉ có thể tuần tự hóa thành cá thể mô hình. – yegle

16

Bạn muốn in_bulk phương pháp truy vấn, theo tài liệu:

Mất một danh sách các giá trị khóa chính và trả về một ánh xạ từ điển mỗi giá trị khóa chính để một thể hiện của đối tượng với ID nhất định.

Phải mất một danh sách các ID, vì vậy bạn sẽ cần phải nhận được rằng đầu tiên thông qua phương thức values_list:

ids = MyModel.objects.values_list('id', flat=True) 
model_dict = MyModel.objects.in_bulk(ids) 
+0

Trong khi điều này không giúp tôi trong trường hợp này, đó là khá gọn gàng và tôi không biết điều đó. Cảm ơn – LarrikJ

+0

Django cho phép bạn có các khóa chính không phải là số nguyên. Nếu mô hình của bạn được thiết lập đúng theo cách này, đây có thể vẫn là một giải pháp tốt. – SingleNegationElimination

+0

tôi đang làm chính xác điều tương tự. tôi đã nhận id nhưng tôi muốn dữ liệu trên các id trong một mảng. Xin vui lòng giúp tôi – numerah

211

Bạn cũng có thể dựa trên mã django đã viết;).

from django.forms.models import model_to_dict 
model_to_dict(instance, fields=[], exclude=[]) 
+12

Nó là giải pháp rất tốt đẹp nhưng tôi đã nhận thấy rằng có một bắt. Vì phương thức này được viết để sử dụng dưới dạng nó không đổ các trường có thể chỉnh sửa = Cờ giả. –

+1

Có thể thêm rằng điều này dường như không nhận được các trường của mô hình gốc. –

+36

'model_to_dict (instance, fields = [field.name cho trường trong instance._meta.fields])' –

2

Hay em cố gắng làm một cái gì đó như:

def someview(req): 
    models = MyModel.objects.all() 
    toTuple = lambda field: (getattr(field, 'someatt'), getattr(field, 'someotheratt')) 
    data = dict(map(toTuple,models)) 
    return render_to_response(template, data) 
6

dict((x.name, getattr(o, x.name)) for x in o._meta.fields)

+0

Một trong những khác biệt giữa giải pháp này và Luper với serialize ('python', ...) là ở đây nước ngoài các trường khóa sẽ được biểu diễn dưới dạng các đối tượng liên quan thực tế. Sử dụng serialize bạn sẽ chỉ nhận được giá trị id của đối tượng liên quan, chứ không phải chính đối tượng đó. –

4

Có lẽ tôi đang thiếu cái gì, nhưng đối tượng Django có một thuộc tính __dict__ mà dường như là những gì bạn muốn.

+0

Dường như không thể tìm thấy ở đây. Nó nói [My Model Object] không có thuộc tính 'dict' –

+0

Tôi nghĩ @ben có nghĩa là '__dict__'. – Nav

2

Để có được một bản đồ của tất cả các trường hợp trong một queryset thành một cuốn từ điển duy nhất với một lĩnh vực mô hình quy định như chìa khóa, hãy thử làm điều này

from django.forms.models import model_to_dict 
from myApp.models import myModel 

allObjs = myModel.objects.all() 
f = {}   # initialise the output 
key = 'key' # one of the fields from myModel 

[f.update({x[key]: x}) for x in [model_to_dict(y) for y in allObjs]] 
return f 
2

Để có được giá trị của một mô hình vào từ điển, thêm dưới đây mã tại nơi u cần từ điển mà

from models import DictModel 

activity_map = dict(Plan.objects.values_list('key', 'value')) 

activity_map là một cuốn từ điển chứa các thông tin cần thiết.

2
user = mymodel.objects.all() 
user.values() 

Bạn cũng có thể thử

user.values_list() # getting as list 
Các vấn đề liên quan