Django:将一整套Model的对象转换为单个字典

时间:2009-07-14 03:35:54

标签: python django django-models dictionary

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

在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

总的来说,你们真的让我感到惊讶的是你的回答是多么有用,以及接近它的方式有多么不同。非常感谢。

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

我想要的是能够将查询集中的所有实例映射到具有指定模型字段作为键的单个字典中。
另一方面,model_to_dict将单个模型实例转换为字典
现在,我当时的需求非常具体,可能非常罕见(我甚至不记得我需要它的项目,或者为什么)。所以任何寻找有关model_to_dict信息的人都会发现我的问题确实很有用,我会感到非常惊讶。对不起。

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

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

12 个答案:

答案 0 :(得分:213)

您还可以依赖已编写的django代码;)。

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

答案 1 :(得分: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'}]

答案 2 :(得分:17)

这是否需要创建一个实际的字典?你能不能只看到像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):
        ...

然后你可以用这种方式包装模型:

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

等...

答案 3 :(得分:16)

根据文档:

,您需要in_bulk queryset方法
  

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

它需要一个ID列表,因此您需要先通过values_list方法获取ID:

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

答案 4 :(得分:14)

您可以使用python serializer

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

答案 5 :(得分:6)

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

答案 6 :(得分:5)

使用

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

根据Tom Leys的建议,我们不需要获得整个对象,我们只能得到我们需要的那些值。

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

如果您需要所有值,最好将整个对象保存在dict中,例如

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

答案 7 :(得分:4)

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

答案 8 :(得分: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)

答案 9 :(得分: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

答案 10 :(得分:2)

要将模型的值放入字典中,请在需要该字典的地方添加以下代码

from models import DictModel

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

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

答案 11 :(得分:2)

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

您也可以尝试

user.values_list() # getting as list