Преобразование django ValuesQuerySet в объект json - PullRequest
17 голосов
/ 06 июля 2011

Я пытаюсь использовать функцию ValuesQuerySet в Django, чтобы ограничить количество полей, возвращаемых из запроса, только теми, которые мне нужны. Я хотел бы сериализовать этот набор данных в объект JSON. Однако Django продолжает выдавать ошибку. Ниже я включил свой код и полученную ошибку:

objectList = ConventionCard.objects.values('fileName','id').filter(ownerUser = user)
data = serializers.serialize('json', objectList)
return HttpResponse(data, mimetype='application/javascript')

Ошибка:

Exception Type:     AttributeError
Exception Value:    'dict' object has no attribute '_meta'
Exception Location:     C:\Python27\lib\site-packages\django\core\serializers\base.py in serialize, line 41

Спасибо!

Ответы [ 4 ]

34 голосов
/ 09 февраля 2012

Сначала приведите набор значений QuerySet к списку:

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

list(query_set)

Удаление вызова values в соответствии с предложением ars заставляет менеджера вытянуть все столбцы из таблицы, а не только те, которые вам нужны.

14 голосов
/ 06 июля 2011

Попробуйте подмножество полей в вашем списке значений с помощью метода serialize, используя вместо этого QuerySet:

from django.core import serializers
objectQuerySet = ConventionCard.objects.filter(ownerUser = user)
data = serializers.serialize('json', objectQuerySet, fields=('fileName','id'))
9 голосов
/ 30 июля 2013

Я продолжал получать объект dict без атрибута _meta Ошибка при использовании метода list() выше.Однако я нашел этот фрагмент , который делает трюк

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 голос
/ 17 декабря 2012

Просто, чтобы добавить несколько деталей, которые я нашел:

Когда я попробовал @ars ответить, указав поля, например:

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

Я получил это:

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

Это не было простой сериализацией значений, как я хотел.

Так что я попробовал решение, предложенное @Aaron, преобразовав набор значений в список, который не работал в первый раз, потому чтокодировщик по умолчанию не может работать с объектами типа float или datetime.

Итак, я использовал решение @Aaron, но использовал кодер JSON, который используется сериализатором django (DjangoJSONEncoder), передав его в виде kwarg simplejson.dumps(), например:

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

return HttpResponse(simplejson.dumps( s_logs, cls=DjangoJSONEncoder ), mimetype='application/javascript')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...