Django: convertir un conjunto completo de los objetos de un modelo en un solo diccionario

Si vienes de Google en busca de un modelo a dictar, omite mi pregunta y simplemente salta a la primera respuesta. Mi pregunta solo te confundirá.

¿Hay una buena forma en Django de un conjunto completo de objetos de un Modelo en un solo diccionario? Quiero decir, así:

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

… ¿el resultado es un diccionario con los pares clave / valor formados por registros en el Modelo? ¿Alguien más ha visto esto como útil para ellos?

Gracias.

Actualizar
Lo único que quería agregar es que mi objective final es poder hacer una búsqueda de variables simple dentro de una plantilla. Algo como:

 {{ DictModel.exampleKey }} 

Con un resultado de DictModel.objects.get (key__exact = exampleKey) .value

Sin embargo, en general, ustedes realmente me han sorprendido con lo útiles que son todas sus respuestas y lo diferentes que pueden ser las formas de abordarlo. Muchas gracias.

Actualización de octubre de 2011: esta pregunta es el resultado principal si Google “django model_to_dict”, que en realidad es bastante horrible dado que resuelve un problema diferente al que estaba preguntando.

Lo que quería era poder asignar todas las instancias de un conjunto de consultas en un único diccionario con un campo de modelo específico como clave.
model_to_dict, por otro lado, convierte una única instancia de modelo en un diccionario.

Ahora, mis necesidades en ese momento eran bastante específicas, y probablemente extremadamente raras (ni siquiera puedo recordar el proyecto para el que lo necesitaba, o por qué). Por lo tanto, me sorprendería que cualquier persona que busque información sobre model_to_dict encuentre mi pregunta realmente útil. Lo siento.

model_to_dict parece ser un caso de uso mucho más común que el que tenía.

Actualización de diciembre de 2011:
Cambié el título para, con suerte, reflejar mejor mi intención original.

¿Esto necesita crear un dict real? ¿Podrías arreglártelas solo con algo que parecía un 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): ... 

A continuación, podría envolver un modelo de esta manera:

 modelDict = DictModelAdaptor(DictModel) modelDict["name"] = "Bob Jones" 

etc …

También puede confiar en el código django ya escrito;).

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

Está buscando el miembro Valores de QuerySet que le permite obtener una lista de diccionarios de su consulta

Devuelve un ValuesQuerySet: un QuerySet que se evalúa en una lista de diccionarios en lugar de objetos de instancia de modelo. Cada uno de esos diccionarios representa un objeto, con las claves correspondientes a los nombres de atributo de los objetos modelo.

 >>> Blog.objects.values() [{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}], >>> Blog.objects.values('id', 'name') [{'id': 1, 'name': 'Beatles Blog'}] 

Desea el método in_bulk in_bulk que, según los documentos:

Toma una lista de valores de clave primaria y devuelve un diccionario que asigna cada valor de clave primaria a una instancia del objeto con el ID dado.

Toma una lista de ID, por lo que deberá obtenerla primero a través del método values_list :

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

Puedes usar el serializador 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)

utilizar

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

Como lo sugiere Tom Leys, no necesitamos obtener el objeto completo, solo podemos obtener los valores que necesitamos, por ejemplo

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

y si necesita todos los valores, es mejor mantener todo el objeto en dict, por ejemplo

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

Tal vez me esté perdiendo algo, pero los objetos Django tienen un atributo __dict__ que parece ser lo que quieres.

¿O estabas tratando de hacer algo como:

 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) 

Para obtener un mapa de todas las instancias de un conjunto de consultas en un solo diccionario con un campo de modelo específico como clave, intente hacer esto

 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 

Para obtener los valores de un modelo en el diccionario, agregue el código a continuación en el lugar donde necesita ese diccionario

 from models import DictModel activity_map = dict(Plan.objects.values_list('key', 'value')) 

activity_map es un diccionario que contiene información requerida.

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

También puedes probar

 user.values_list() # getting as list