How to serialize Django queryset.values() into json?
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')])
Comments
-
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- over 12 yearsYes I am aware that
.values()
returns a list, however simplejson.dumps gives me ajsondata is not JSON serializable
, theValuesQuerySet
is in the form:[{'key1': 'value1', 'key2': 'value2'}]
-
Davor Lucic over 12 yearsYes, it depends on what data looks like, the first example from the linked answer is what you are looking for.
-
Daniel Roseman over 12 years@bash- just call
list()
on it first. -
Davor Lucic over 12 yearsYes
list(ValuesQuerySet)
should return list which can then be serialized withsimplejson
. -
bash- over 12 yearsthanks, 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 over 12 years
-
Davor Lucic over 12 yearsRemember that will only work if you get one result.
list()
solution will work in both cases. -
bash- over 12 years@rebus thanks, it didn't work before because there was a DecimalField and it couldn't be serialized
-
Kalob Taulien about 6 yearsThis 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 about 4 yearsFinally, this helped me which I want the Queryset to be converted to JSON and then returned to the template.
-
user2162611 almost 4 yearsI had similar problem. Above solution of using list(queryset) worked very well. Thanks Max!
-
Code-Apprentice almost 3 yearsWhy do you
serialize()
and thenloads()
just to have theJsonResponse
serialize the list again. This is extra, unnecessary work. -
Shedrack over 2 yearsThis works like a charm!!!