web-dev-qa-db-fra.com

Django: Conversion d'un ensemble complet d'objets d'un modèle en un seul dictionnaire

Si vous êtes venu de Google à la recherche d'un modèle à dicter, sautez ma question et passez directement à la première réponse. Ma question ne fera que vous embrouiller.

Existe-t-il un bon moyen dans Django pour l'ensemble entier des objets d'un modèle dans un seul dictionnaire? Je veux dire, comme ceci:

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


DictModel.objects.all().to_dict()

... avec pour résultat un dictionnaire avec les paires clé/valeur constituées d'enregistrements dans le modèle? Quelqu'un d'autre a-t-il vu cela comme étant utile pour eux?

Merci.

mise à jour
Je voulais juste ajouter que mon objectif ultime est de pouvoir effectuer une simple recherche de variable dans un modèle. Quelque chose comme:

{{ DictModel.exampleKey }}

Avec un résultat de DictModel.objects.get (key__exact = exampleKey) .value

Dans l'ensemble, cependant, vous m'avez vraiment surpris de la façon dont toutes vos réponses sont utiles et de la façon dont les façons de procéder peuvent être différentes. Merci beaucoup.

Mise à jour d'octobre 2011: Cette question est le meilleur résultat si vous recherchez "Django model_to_dict" sur Google, ce qui est en fait assez horrible étant donné qu'il résout un problème différent de ce que je demandais.

Ce que je voulais, c'était de pouvoir mapper toutes les instances d'un ensemble de requêtes dans un dictionnaire unique avec un champ de modèle spécifié comme clé.
model_to_dict, d'autre part convertit une seule instance de modèle en dictionnaire.

Maintenant, mes besoins à l'époque étaient sacrément spécifiques, et probablement extrêmement rares (je ne me souviens même pas du projet pour lequel j'en avais besoin, ni pourquoi). Je serais donc assez surpris que toute personne recherchant des informations sur model_to_dict trouve ma question réellement utile. Pardon.

model_to_dict semble être un cas d'utilisation beaucoup plus courant que moi.

Mise à jour décembre 2011:
J'ai changé le titre pour, je l'espère, mieux refléter mon intention initiale.

59
LarrikJ

Est-ce que cela doit créer un dicton réel? pourriez-vous vous en sortir avec quelque chose qui ressemblait à un dicton?

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):
        ...

Vous pouvez ensuite envelopper un modèle de cette manière:

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

etc...

17

Vous recherchez le membre de valeurs de QuerySet qui vous permet d'obtenir une liste de dictionnaires à partir de votre requête

Renvoie un ValuesQuerySet - un QuerySet qui évalue une liste de dictionnaires au lieu d'objets d'instance de modèle. Chacun de ces dictionnaires représente un objet, avec les clés correspondant aux noms d'attribut des objets de modèle.

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

Vous voulez le in_bulk méthode queryset qui, selon les documents:

Prend une liste de valeurs de clé primaire et renvoie un dictionnaire mappant chaque valeur de clé primaire à une instance de l'objet avec l'ID donné.

Il faut une liste d'ID, donc vous devrez d'abord l'obtenir via le values_list méthode:

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

Vous pouvez utiliser le pythonsérialiseur :

from Django.core import serializers
data = serializers.serialize('python', DictModel.objects.all())
14
Luper Rouch

dict((x.name, getattr(o, x.name)) for x in o._meta.fields)

6
tug

utilisation

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

Comme suggéré par Tom Leys, nous n'avons pas besoin d'obtenir l'objet entier, nous ne pouvons obtenir que les valeurs dont nous avons besoin, par exemple.

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

et si vous avez besoin de toutes les valeurs, il est préférable de garder l'objet entier en dict par exemple.

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

Il me manque peut-être quelque chose, mais Django ont un __dict__ attribut qui semble être ce que vous voulez.

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

Vous pouvez aussi essayer

user.values_list() # getting as list
2
Rajan Mandanka

Ou essayiez-vous de faire quelque chose comme:

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)
2
Shea Kauffman

Pour obtenir une carte de toutes les instances d'un ensemble de requêtes dans un dictionnaire unique avec un champ de modèle spécifié comme clé, essayez de faire ceci

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
2
iancoleman

Pour obtenir les valeurs d'un modèle dans le dictionnaire, ajoutez le code ci-dessous à l'endroit où vous avez besoin de ce dictionnaire

from models import DictModel

activity_map = dict(Plan.objects.values_list('key', 'value'))

activity_map est un dictionnaire qui contient les informations requises.

2
eswar