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.
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...
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'}]
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)
Vous pouvez utiliser le python
sérialiseur :
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)
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())
Il me manque peut-être quelque chose, mais Django ont un __dict__
attribut qui semble être ce que vous voulez.
user = mymodel.objects.all()
user.values()
Vous pouvez aussi essayer
user.values_list() # getting as list
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)
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
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.