update queryset create python django django-models dictionary

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