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