How to serialize Django queryset.values() into json?

76,497

Solution 1

Django serializers can only serialize queryset, values() does not return queryset rather ValuesQuerySet object. So, avoid using values(). Rather, specifiy the fields you wish to use in values(), in the serialize method as follows:

Look at this SO question for example

objectQuerySet = ConventionCard.objects.filter(ownerUser = user)
data = serializers.serialize('json', list(objectQuerySet), fields=('fileName','id'))

Instead of using objectQuerySet.values('fileName','id'), specify those fields using the fields parameter of serializers.serialize() as shown above.

Solution 2

As other people have said, Django's serializers can't handle a ValuesQuerySet. However, you can serialize by using a standard json.dumps() and transforming your ValuesQuerySet to a list by using list(). If your set includes Django fields such as Decimals, you will need to pass in DjangoJSONEncoder. Thus:

import json
from django.core.serializers.json import DjangoJSONEncoder

queryset = myModel.objects.filter(foo_icontains=bar).values('f1', 'f2', 'f3')
serialized_q = json.dumps(list(queryset), cls=DjangoJSONEncoder)

Solution 3

Make list from objectQuerySet:

data_ready_for_json = list( ConventionCard.objects.filter(ownerUser = user).values('fileName','id') )

Solution 4

My solution, It's work fine

from django.core.serializers import serialize
import json

permission_list = Permission.objects.all().order_by('-id')
permission_serialize= json.loads(serialize('json', permission_list))
return JsonResponse({'data': permission_serialize})

Solution 5

Just cast to dict every item and create json with json.dumps:

json.dumps([dict(item) for item in SomeModel.objects.all().values('id', 'title')])
Share:
76,497
bash-
Author by

bash-

Just an average joe.

Updated on July 22, 2022

Comments

  • bash-
    bash- almost 2 years

    I have a model that has many fields, however for this problem I only need 3 of those fields. When I try to serialize a .values set I get an exception:

    'dict' object has no attribute '_meta'

    This is my code:

    queryset = myModel.objects.filter(foo_icontains=bar).values('f1', 'f2', 'f3')
    serialized_q = serializers.serialize('json', queryset, ensure_ascii=False)
    
  • bash-
    bash- over 12 years
    Yes I am aware that .values() returns a list, however simplejson.dumps gives me a jsondata is not JSON serializable, the ValuesQuerySet is in the form: [{'key1': 'value1', 'key2': 'value2'}]
  • Davor Lucic
    Davor Lucic over 12 years
    Yes, it depends on what data looks like, the first example from the linked answer is what you are looking for.
  • Daniel Roseman
    Daniel Roseman over 12 years
    @bash- just call list() on it first.
  • Davor Lucic
    Davor Lucic over 12 years
    Yes list(ValuesQuerySet) should return list which can then be serialized with simplejson.
  • bash-
    bash- over 12 years
    thanks, just a side note, in the SO question you linked, does that approach query the db for all the fields and then subset it for the 2 fields or would it only query the db for just those 2 fields?
  • Davor Lucic
    Davor Lucic over 12 years
    I think it would query all fields, you could perhaps use only when querying. Though I am not quite sure. Debug it to see how the query looks like.
  • Davor Lucic
    Davor Lucic over 12 years
    Remember that will only work if you get one result. list() solution will work in both cases.
  • bash-
    bash- over 12 years
    @rebus thanks, it didn't work before because there was a DecimalField and it couldn't be serialized
  • Kalob Taulien
    Kalob Taulien about 6 years
    This was the quickest and simplest solution for me. I appended JsonResponse(data_ready_for_json, safe=False) and it worked perfectly in an Ajax call.
  • Kyle_397
    Kyle_397 about 4 years
    Finally, this helped me which I want the Queryset to be converted to JSON and then returned to the template.
  • user2162611
    user2162611 almost 4 years
    I had similar problem. Above solution of using list(queryset) worked very well. Thanks Max!
  • Code-Apprentice
    Code-Apprentice almost 3 years
    Why do you serialize() and then loads() just to have the JsonResponse serialize the list again. This is extra, unnecessary work.
  • Shedrack
    Shedrack over 2 years
    This works like a charm!!!