Django:将整个模型对象集合转换为单个字典

63 投票
12 回答
49468 浏览
提问于 2025-04-15 12:53

如果你是从谷歌过来的,想找关于 model to dict 的内容,可以直接跳到第一个答案,我的问题可能会让你更困惑。

在 Django 中,有没有好的方法把一个模型的所有对象放进一个字典里?就像这样:

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 个回答

26

你在寻找 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'}]
216

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

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

这个是不是需要真的创建一个字典?有没有可能只用一个看起来像字典的东西就行了?

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"

等等……

撰写回答