Django: преобразование всего набора объектов модели в один словарь - PullRequest
59 голосов
/ 14 июля 2009

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

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

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

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

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

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

Ответы [ 12 ]

213 голосов
/ 05 ноября 2009

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

from django.forms.models import model_to_dict
model_to_dict(instance, fields=[], exclude=[])
27 голосов
/ 14 июля 2009

Вы ищете Значения члена 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'}]
17 голосов
/ 14 июля 2009

Нужно ли создавать настоящий дикт? Вы могли бы обойтись только с чем-то, что было похоже на диктовку?

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"

и т.д ...

16 голосов
/ 14 июля 2009

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

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

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

ids = MyModel.objects.values_list('id', flat=True)
model_dict = MyModel.objects.in_bulk(ids)
14 голосов
/ 14 июля 2009

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

from django.core import serializers
data = serializers.serialize('python', DictModel.objects.all())
6 голосов
/ 07 августа 2010

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

5 голосов
/ 14 июля 2009

использование

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(((m.key, m) for m in DictModel.objects.all())
4 голосов
/ 07 сентября 2011

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

2 голосов
/ 31 декабря 2014
user = mymodel.objects.all()
user.values() 

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

user.values_list() # getting as list
2 голосов
/ 11 сентября 2013

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

from models import DictModel

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...