[Fixed]-Converting a django ValuesQuerySet to a json object

18👍

Try subsetting the fields in your values list through the serialize method using a QuerySet instead:

from django.core import serializers
objectQuerySet = ConventionCard.objects.filter(ownerUser = user)
data = serializers.serialize('json', objectQuerySet, fields=('fileName','id'))
👤ars

35👍

Cast the ValuesQuerySet to a list first:

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

list(query_set)

Removing the values call as suggested by ars causes the manager to pull all columns from the table, instead of only the two you need.

👤Aaron

14👍

I continued to get a dict object has no attribute _meta error when using the list() method above. However I found this snippet that does the trick

def ValuesQuerySetToDict(vqs):
    return [item for item in vqs]

# Usage
data = MyModel.objects.values('id','title','...','...')
data_dict = ValuesQuerySetToDict(data)
data_json = simplejson.dumps(data_dict)

1👍

Just to add a few details I’ve found:

When I tried @ars answer specifying the fields, like:

s_logs = serializers.serialize("json", logs, fields=('user', 'action', 'time'))

I get this:

[{"pk": 520, "model": "audit.auditlog", "fields": {"user": 3, "action": "create", "time":"2012-12-16T12:13:45.540"}}, ... ]

Which was not a simple serialization of the values as I wanted it.

So I tried the solution proposed by @Aaron, converting the valuesqueryset to a list, which didn’t work the first time because the default encoder cannot deal with floats or datetime objects.

So I used @Aaron solution but using the JSON encoder that is used by django’s serializer (DjangoJSONEncoder) by passing it as a kwarg to simplejson.dumps(), like this:

s_logs = list(logs.values('user', 'ip', 'object_name', 'object_type', 'action', 'time'))

return HttpResponse(simplejson.dumps( s_logs, cls=DjangoJSONEncoder ), mimetype='application/javascript')
👤AJJ

Leave a comment