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'))
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.
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')