63 votes

Django: la Conversion de la totalité d'un ensemble de modèles d'objets dans un seul dictionnaire

Si vous êtes venu ici de Google à la recherche de modèle de dict, passez à ma question, et juste aller en bas de page à la première réponse. Ma question ne vous confondre.

Est-il une bonne façon de Django d'ensemble d'un Modèle d'objets 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 des disques dans le Modèle? Quelqu'un d'autre a vu cela comme étant utile pour eux?

Merci.

Mise à jour
Je voulais juste ajouter, c'est que mon but ultime est d'être capable de faire une simple variable de recherche à l'intérieur d'un Modèle. Quelque chose comme:

{{ DictModel.exampleKey }}

Avec un résultat de DictModel.objets.get(clé__exacte=exampleKey).valeur

Dans l'ensemble, cependant, les gars, vous avez m'a vraiment surpris avec combien utile allof vos réponses sont, et comment les différentes façons de l'aborder, peut-être. Merci beaucoup.

Mise À Jour Octobre 2011: Cette question est le résultat haut de la page si vous Google "django model_to_dict", qui est en fait assez horrible, étant donné qu'il résout un problème différent que ce que j'ai demandé.

Ce que je voulais, c'était être en mesure de cartographier l'ensemble des instances dans un queryset dans un seul dictionnaire avec un modèle spécifié champ comme clé.
model_to_dict, d'autre part convertit une seule instance du modèle dans un dictionnaire.

Maintenant, mes besoins à l'époque, étaient sacrément spécifiques, et probablement extrêmement rare (je ne peux pas me souviens même le projet, j'ai besoin d'elle, ou pourquoi). Donc, je serais assez surpris que n'importe qui à la recherche pour plus d'informations sur model_to_dict va trouver ma question en fait utile. Désolé.

model_to_dict semble être un beaucoup plus commun de l'utilisation de cas que j'ai eu.

Mise À Jour Décembre 2011:
J'ai changé le titre nous l'espérons, de mieux refléter mon intention première.

217voto

Arthur Debert Points 3632

Vous pouvez également compter sur django code déjà écrit ;).

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

Ce qui concerne Arthur

26voto

Tom Leys Points 10453

Vous êtes à la recherche pour les Valeurs de membre de QuerySet qui vous permet d'obtenir une liste de dictionnaires à partir de votre requête

Retourne un ValuesQuerySet -- un QuerySet qui donne une liste de dictionnaires au lieu de modèle-exemple objets. Chacun de ces dictionnaires représente un objet, avec les touches correspondant pour les noms d'attribut de modèle objets.

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

19voto

IfLoop Points 59461

N'est ce besoin de créer une réelle dict? pourriez-vous en tirer avec seulement quelque chose qui ressemblait à une 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):
        ...

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

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

etc...

17voto

Daniel Roseman Points 199743

Vous voulez l' in_bulk queryset méthode qui, selon les docs:

Prend une liste de clés primaires des valeurs et de l' retourne un dictionnaire de la cartographie de chaque clé primaire de la valeur à une instance de l'objet avec l'ID donné.

Il prend une liste d'Id, de sorte que vous aurez besoin d'obtenir ce premier via l' values_list méthode:

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

14voto

Luper Rouch Points 5033

Vous pouvez utiliser l' python sérialiseur:

from django.core import serializers
data = serializers.serialize('python', DictModel.objects.all())

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X