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 ответов:
нужно ли создавать фактический дикт? вы могли бы обойтись только тем, что выглядело как дикт?
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(((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