[Django]-Django: Converting an entire set of a Model's objects into a single dictionary

19πŸ‘

βœ…

Does this need to create an actual dict? could you get by with only something that looked like a 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):
        ...

You could then wrap a model in this way:

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

etc…

217πŸ‘

You can also rely on django code already written ;).

from django.forms.models import model_to_dict
model_to_dict(instance, fields=[], exclude=[])
πŸ‘€Arthur Debert

26πŸ‘

You are looking for the Values member of QuerySet which allows you to get a list of dictionaries from your query

Returns a ValuesQuerySet β€” a QuerySet
that evaluates to a list of
dictionaries instead of model-instance
objects. Each of those dictionaries represents
an object, with the keys corresponding
to the attribute names of model
objects.

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

17πŸ‘

You want the in_bulk queryset method which, according to the docs:

Takes a list of field values (id_list) and the field_name for those values, and returns a dictionary mapping each value to an instance of the object with the given field value. If id_list isn’t provided, all objects in the queryset are returned. field_name must be a unique field, and it defaults to the primary key.

It takes a list of IDs, so you’ll need to get that first via the values_list method:

ids = MyModel.objects.values_list('id', flat=True)
ids_to_model_instances = MyModel.objects.in_bulk(ids)
# {1: <MyModel: 1>, 2: <MyModel: 2>, 3: <MyModel: 3>}

14πŸ‘

You can use the python serializer:

from django.core import serializers
data = serializers.serialize('python', DictModel.objects.all())
πŸ‘€Luper Rouch

8πŸ‘

use

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

As suggested by Tom Leys, we do not need to get whole object, we can get only those values we need e.g.

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

and if you need all values, it is better to keep whole object in dict e.g.

dict(((m.key, m) for m in DictModel.objects.all())
πŸ‘€Anurag Uniyal

6πŸ‘

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

πŸ‘€tug

4πŸ‘

Perhaps I’m missing something, but Django objects have a __dict__ attribute which seems be what you want.

πŸ‘€bjw

2πŸ‘

To get values of a models into dictionary, add below code at the place where u need that dictionary

from models import DictModel

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

activity_map is a dictionary which contains required information .

πŸ‘€eswar

2πŸ‘

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

You can also try

user.values_list() # getting as list

1πŸ‘

Or were you trying to do something like:

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)
πŸ‘€Shea Kauffman

1πŸ‘

To get a map of all of the instances in a queryset into a single dictionary with a specified model field as the key, try doing this

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
πŸ‘€iancoleman

Leave a comment