python - queryset - Django: Convertir un conjunto completo de objetos de un Modelo en un solo diccionario
django update (12)
¿Esto necesita crear un dict real? ¿Podrías vivir con solo algo que pareciera 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, puede ajustar un modelo de esta manera:
modelDict = DictModelAdaptor(DictModel)
modelDict["name"] = "Bob Jones"
etc ...
Si vino aquí desde Google en busca de modelo a dict, omita mi pregunta, y simplemente salte a la primera respuesta. Mi pregunta solo te confundirá.
¿Hay una buena manera en Django para todo el conjunto 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()
... con el resultado de ser 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
Solo quería agregar que mi objetivo final es poder hacer una simple búsqueda de variables 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 de lo útiles que son todas sus respuestas y cuán diferentes pueden ser las formas de abordarlas. 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 mapear todas las instancias en un conjunto de consulta en un único diccionario con un campo de modelo específico como clave.
model_to_dict, por otro lado, convierte una sola instancia de modelo en un diccionario.
Ahora, mis necesidades en ese momento eran bastante específicas, y probablemente extremadamente raras (ni siquiera recuerdo el proyecto para el que lo necesitaba, o por qué). Así que estaría bastante sorprendido de que cualquiera que busque información sobre model_to_dict encuentre realmente útil mi pregunta. Lo siento.
model_to_dict parece ser un caso de uso mucho más común que el que tuve.
Actualización de diciembre de 2011:
Cambié el título para reflejar mejor mi intención original.
¿O estabas tratando de hacer algo como esto?
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)
Desea el método in_bulk
queryset que, de acuerdo con los documentos:
Toma una lista de valores de clave primaria y devuelve un mapeo de diccionario de cada valor de clave primaria a una instancia del objeto con la ID dada.
Lleva 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)
Está buscando el miembro Values de QuerySet que le permite obtener una lista de diccionarios de su consulta
Devuelve un ValuesQuerySet: un QuerySet que evalúa una lista de diccionarios en lugar de objetos de instancia de modelo. Cada uno de esos diccionarios representa un objeto, con las teclas correspondientes a los nombres de los atributos 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''}]
Para obtener los valores de un modelo en el diccionario, agregue el código siguiente 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.
Para obtener un mapa de todas las instancias en un conjunto de consulta 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
Puede usar el serializer python
:
from django.core import serializers
data = serializers.serialize(''python'', DictModel.objects.all())
Tal vez me falta algo, pero los objetos Django tienen un atributo __dict__
que parece ser lo que quieres.
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=[])
utilizar
dict(((m.key, m.value) for m in DictModel.objects.all())
Según lo sugerido por Tom Leys, no necesitamos obtener un 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 eg
dict(((m.key, m) for m in DictModel.objects.all())
dict((x.name, getattr(o, x.name)) for x in o._meta.fields)
user = mymodel.objects.all()
user.values()
También puedes probar
user.values_list() # getting as list