Django: преобразование всего набора объектов модели в один словарь


Если вы пришли сюда из Google в поисках модели для диктовки, пропустите мой вопрос и просто перейдите к первому ответу. Мой вопрос только запутает вас.

есть ли хороший способ в Django для всего набора объектов модели в один словарь? Я имею в виду, вот так:

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


DictModel.objects.all().to_dict()

... в результате получается словарь с парами ключ / значение, состоящими из записей в модели? Кто-нибудь еще видел, что это полезно для их?

спасибо.

обновление
Я просто хотел добавить, что моя конечная цель-сделать простой поиск переменных внутри шаблона. Что-то вроде:

{{ DictModel.exampleKey }}

С результатом DictModel.объекты.get (key__exact=exampleKey).значение

в целом, хотя, вы, ребята, действительно удивили меня тем, насколько полезны все ваши ответы, и насколько разные способы подхода к нему могут быть. Спасибо много.

Обновление Октябрь 2011 Года: Этот вопрос является лучшим результатом, если Вы Google "django model_to_dict", что на самом деле довольно ужасно, учитывая, что он решает другую проблему, чем то, что я спрашивал.

Я хотел иметь возможность сопоставить все экземпляры в наборе запросов в один словарь с указанным полем модели в качестве ключа.
model_to_dict, с другой стороны, преобразует один экземпляр модели в словарь.

Теперь мои потребности в то время были довольно специфическими и, вероятно, чрезвычайно редкими (я даже не могу вспомнить проект, для которого он мне нужен, или почему). Поэтому я был бы очень удивлен, что любой, кто ищет информацию о model_to_dict, найдет мой вопрос действительно полезным. Извиняюсь.

model_to_dict кажется гораздо более распространенным случаем использования, чем у меня.

Обновление Dec 2011:
Я изменила название, надеюсь лучше отрази мое первоначальное намерение.

12 58

12 ответов:

нужно ли создавать фактический дикт? вы могли бы обойтись только тем, что выглядело как дикт?

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"

etc...

вы также можете полагаться на уже написанный код django ;).

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

вы ищете значения члена QuerySet которая позволяет получить список словарей из вашего запроса

возвращает ValuesQuerySet -- A 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 метод, который, согласно документам:

принимает список значений первичного ключа и возвращает сопоставление словаря каждый значение первичного ключа для экземпляра объект с заданным идентификатором.

он принимает список идентификаторов, так что вам нужно будет получить это сначала через 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())

как предложил том Лейс, нам не нужно получать весь объект, мы можем получить только те значения, которые нам нужны, например

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

и если вам нужны все значения, то лучше держать весь объект в dict например

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

возможно, я что-то упускаю, но объекты Django имеют __dict__ атрибут, который кажется то, что вы хотите.

или вы пытаетесь сделать что-то вроде:

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)

чтобы получить карту всех экземпляров в наборе запросов в один словарь с указанным полем модели в качестве ключа, попробуйте сделать это

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