Django:将一整套模型对象转换为单个字典

如果你是从谷歌来到这里寻找模型的话,跳过我的问题,然后跳到第一个答案。 我的问题只会让你困惑。

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

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

…结果是一个由模型中的logging组成的键/值对的字典? 有没有人认为这对他们有用?

谢谢。

更新
我只是想补充说的是,我的最终目标是能够在模板中做一个简单的variables查找。 就像是:

 {{ DictModel.exampleKey }} 

由于DictModel.objects.get(key__exact = exampleKey).value的结果

总的来说,尽pipe如此,你们真的让我感到惊讶,因为你们的回答是多么有帮助,以及接近它的方式有多不同。 非常感谢。

更新2011年10月:这个问题是最好的结果,如果你谷歌“django model_to_dict”,这实际上是非常糟糕的,因为它解决了一个不同于我问的问题。

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

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

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

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

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

 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" 

等等…

你也可以依靠已经写好的django代码;)。

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

您正在查找QuerySet的Values成员,它允许您从查询中获取字典列表

返回一个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'}] 

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

获取主键值列表,并返回一个将每个主键值映射到具有给定ID的对象实例的字典。

它需要一个ID列表,所以你需要先通过values_list方法得到它:

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

你可以使用python 序列化程序 :

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

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

使用

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

正如Tom Leys所build议的那样,我们不需要得到整个对象,我们只能得到我们需要的那些值

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

如果你需要所有的值,那么最好把整个对象保存在字典中

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

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

要将查询集中的所有实例映射到指定模型字段作为关键字的单个字典中,请尝试执行此操作

 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 

要将模型的值转换为字典,请在需要该字典的地方添加以下代码

 from models import DictModel activity_map = dict(Plan.objects.values_list('key', 'value')) 

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

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

你也可以试试

 user.values_list() # getting as list 

或者你是否想要做这样的事情:

 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)