2009-07-14 40 views
57

如果你是从谷歌寻找模型到字典,跳过我的问题,然后跳到第一个答案。我的问题只会让你感到困惑。Django:将整个模型对象转换为单个字典

在Django中,是否有一种很好的方式将整个Model的对象集合到单个字典中?我的意思是,像这样:

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


DictModel.objects.all().to_dict() 

......其结果是,在模型的记录由键/值对的字典?有没有人认为这对他们有用?

谢谢。

更新
我只是想补充的是,我的最终目标是能够做一个模板内一个简单的变量查找。喜欢的东西:

{{ DictModel.exampleKey }} 

随着DictModel.objects.get(key__exact = exampleKey)的.value的

,总的来说,你们真的让我惊讶allof你的反应如何有帮助,以及如何结果不同的方式来接近它可以。非常感谢。

更新2011年10月: 这个问题上的结果,如果你谷歌“的Django model_to_dict”,因为它解决了,比我在问什么不同的问题这实际上是很可怕。

我想要的是能够将查询集中的所有实例映射到指定模型字段作为关键字的单个字典中。
model_to_dict另一方面将单个模型实例转换为字典。

现在,我当时的需求非常具体,可能非常罕见(我甚至不记得我需要它的项目,或者为什么)。所以我会非常惊讶的是,任何正在寻找关于model_to_dict的信息的人都会发现我的问题确实有用。抱歉。

model_to_dict似乎是比我更常见的用例。

更新2011年12月:
我改变了标题希望能更好地反映我的原意。

+1

如果你正在寻找如何将单一的Django模型转换为一个字典,请到这里:http://stackoverflow.com/q/21925671/2800876 – Zags 2016-10-18 20:34:31

+0

`list_of_json = [model_to_dict(模型)在list_of_models模型]` – FreshPow 2017-09-21 20:58:19

回答

17

这是否需要创建一个实际的字典?你只能看到像字典的东西吗?

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): 
     ... 

然后,您可以用这种方式换一个模型:

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

等等

+0

如果这在Template变量查找中起作用,这实际上可能是我想要的。你试过这个吗?我会在几个小时之前。 – LarrikJ 2009-07-14 15:20:57

+0

是的,我在很多情况下都使用过容器适配器,但我当然不想用这种方式来使用整个模型。另请注意,这个例子有些缩写。你会想添加一些额外的处理程序和适当的错误处理。 – SingleNegationElimination 2009-07-14 23:03:48

+0

我选择了这个答案,因为它适合我最好的情况(比我描述的稍微复杂一些)。其他答案很好,并且工作得很好。 我最喜欢的部分是查找一次完成一次,而不是一次加载整个表。直到我看到它,我才意识到我想要的。 – LarrikJ 2009-07-16 14:32:30

26

您正在寻找Values member of QuerySet它允许您从您的查询

得到的词典列表返回ValuesQuerySet - 一个QuerySet 计算结果的 字典而不是模型实例 列表对象。这些字典中的每一个都代表 的一个对象,其中对应的 对应于 对象的属性名称。

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

我不认为他想字典的名单,他想要一个字典,其中关键是模型的关键 – 2009-07-14 03:45:07

5

使用

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

正如汤姆·利思建议,我们并不需要得到整个对象,我们可以得到只有那些价值,我们需要如

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

如果你需要所有的值,最好把整个对象放在字典中,例如,

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

我们应结合的解决方案 - 字典(((M [ “钥匙”],M [“值”])为米DictModel.objects.all()值()) - 这种方式隐藏的id字段是不是从数据库返回 – 2009-07-14 03:50:31

+0

好,我会更新我的搜索解决方案。 ñ,你可以做你的:) – 2009-07-14 05:05:09

14

可以使用pythonserializer

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

我还没有试过Django的序列化器,所以我很难弄清楚这将如何工作。我想我需要在交互式会话中尝试这个想法。不过,它似乎可能是一个解决方案。谢谢。 – LarrikJ 2009-07-14 15:29:01

16

你想要in_bulk queryset方法,根据文档:

注意到主密钥值的列表和 返回一个字典映射每个 主键值来的 一个实例具有指定ID的对象。

这需要ID的列表,所以你需要获得首先通过values_list方法:

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

您也可以依靠Django的代码已经编写)。

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

还是你试图做一些事情,如:

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)

4

也许我失去了一些东西,但Django的对象有一个__dict__属性,这似乎是你想要的。

2

要获取地图的所有的查询集的实例到一个单一的字典,指定模型领域为重点,尝试做这个

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

为了得到一个模型转换成字典的值,添加以下代码在你需要该字典的地方

from models import DictModel 

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

activity_map是一个包含所需信息的字典。

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

你也可以尝试

user.values_list() # getting as list 
相关问题