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

Lar*_*ikJ 59 python django dictionary django-models

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

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

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


DictModel.objects.all().to_dict()
Run Code Online (Sandbox Code Playgroud)

...结果是一个字典,其键/值对由模型中的记录组成?还有其他人认为这对他们有用吗?

谢谢. 我想添加的

更新
是我的最终目标是能够在模板中进行简单的变量查找.就像是:

{{ DictModel.exampleKey }}
Run Code Online (Sandbox Code Playgroud)

使用DictModel.objects.get(key__exact = exampleKey).value的结果

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

更新2011年10月: 如果您使用Google"django model_to_dict",这个问题是最重要的结果,这实际上非常糟糕,因为它解决了与我提出的问题不同的问题.

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

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

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

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

Art*_*ert 213

你也可以依赖已经写过的django代码;).

from django.forms.models import model_to_dict
model_to_dict(instance, fields=[], exclude=[])
Run Code Online (Sandbox Code Playgroud)

  • `model_to_dict(instance,fields = [field.name for instance._meta.fields])) (36认同)
  • 这是一个非常好的解决方案,但我注意到有一个问题.由于此方法是为表单中的使用而编写的,因此它不会转储具有editable = False标志的字段. (12认同)
  • @LarrikJ从你的问题来看,我无法推断出这就是你想要的.此外,使用`model_to_dict`可以让您完全达到您所说的最终目标.让我们不要忘记,你的问题的标题是"将整个模型转换为单个字典" (9认同)
  • 鉴于这个答案有多高评价,我觉得有必要指出model_to_dict提供的东西与我原先要求的东西有根本的不同.model_to_dict将单个模型实例转换为字典,这很棒.我想要的是能够将查询集中的所有实例映射到具有指定模型字段作为键的单个字典中. (2认同)
  • `model_to_dict(instance,fields = [field.name for instance.inmeta.fields])``不会转储具有`editable = False`标志的字段.请改用:`{field.name:field.value_from_object(instance)for instance._meta.fields}} (2认同)

Tom*_*eys 27

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

返回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'}]
Run Code Online (Sandbox Code Playgroud)


Sin*_*ion 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):
        ...
Run Code Online (Sandbox Code Playgroud)

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

modelDict = DictModelAdaptor(DictModel)
modelDict["name"] = "Bob Jones"
Run Code Online (Sandbox Code Playgroud)

等等...


Dan*_*man 16

in_bulk根据文档,您需要queryset方法:

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

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

ids = MyModel.objects.values_list('id', flat=True)
model_dict = MyModel.objects.in_bulk(ids)
Run Code Online (Sandbox Code Playgroud)


Lup*_*uch 14

您可以使用python 序列化器:

from django.core import serializers
data = serializers.serialize('python', DictModel.objects.all())
Run Code Online (Sandbox Code Playgroud)


tug*_*tug 6

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


Anu*_*yal 5

使用

dict(((m.key, m.value) for m in DictModel.objects.all())
Run Code Online (Sandbox Code Playgroud)

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

dict(((m['key'], m['value']) for m in DictModel.objects.values('key', 'value')))
Run Code Online (Sandbox Code Playgroud)

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

dict(((m.key, m) for m in DictModel.objects.all())
Run Code Online (Sandbox Code Playgroud)