Django:将整个模型对象集合转换为单个字典
如果你是从谷歌过来的,想找关于 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 个回答
你在寻找 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'}]
你也可以依靠已经写好的django代码 ;).
from django.forms.models import model_to_dict
model_to_dict(instance, fields=[], exclude=[])
这个是不是需要真的创建一个字典?有没有可能只用一个看起来像字典的东西就行了?
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"
等等……