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

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

Есть ли хороший способ в 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 года: Этот вопрос является лучшим результатом, если вы Google "django model_to_dict", что на самом деле довольно ужасно, учитывая, что он решает другую проблему, чем то, что я просил.


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


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


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



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

Ответ 1

Нужно ли создавать фактический 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"

и т.д...

Ответ 2

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

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

Ответ 3

Вы ищете элемент значений 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'}]

Ответ 4

Вам нужен метод запроса in_bulk, который, согласно документам:

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

Он принимает список идентификаторов, поэтому вам нужно получить это сначала с помощью метода values_list:

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

Ответ 5

Вы можете использовать сериализатор python :

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

Ответ 6

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

Ответ 7

использовать

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())

Ответ 8

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

Ответ 9

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

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)

Ответ 10

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

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

Ответ 11

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

from models import DictModel

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

activity_map - словарь, содержащий требуемую информацию.

Ответ 12

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

Вы также можете попробовать

user.values_list() # getting as list