django сериализует queryset.values ​​() в json - PullRequest
23 голосов
/ 04 октября 2011

У меня есть модель, которая имеет много полей, однако для этой задачи мне нужно только 3 из этих полей. Когда я пытаюсь сериализовать набор .values, я получаю исключение:

Объект 'dict' не имеет атрибута '_meta'

Это мой код:

queryset = myModel.objects.filter(foo_icontains=bar).values('f1', 'f2', 'f3')
serialized_q = serializers.serialize('json', queryset, ensure_ascii=False)

Ответы [ 4 ]

26 голосов
/ 13 августа 2015

Как уже говорили другие люди, сериализаторы Django не могут обрабатывать ValuesQuerySet.Однако вы можете сериализовать с помощью стандартного json.dumps() и преобразовать свой ValuesQuerySet в список с помощью list().Если ваш набор содержит поля Django, такие как десятичные числа, вам нужно будет передать DjangoJSONEncoder .Таким образом:

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)
24 голосов
/ 04 октября 2011

Сериализаторы Django могут только сериализовать набор запросов, values() не возвращает набор запросов, а ValuesQuerySet объект. Поэтому избегайте использования values(). Скорее, укажите поля, которые вы хотите использовать в values(), в методе сериализации следующим образом:

Посмотрите на этот ТАК вопрос , например

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

Вместо использования objectQuerySet.values('fileName','id') укажите эти поля, используя параметр fields serializers.serialize(), как показано выше.

12 голосов
/ 29 ноября 2013

Составить список из objectQuerySet:

data_ready_for_json = list( ConventionCard.objects.filter(ownerUser = user).values('fileName','id') )
2 голосов
/ 19 апреля 2015

Просто приведите к каждому элементу и создайте json с помощью json.dumps:

json.dumps([dict(item) for item in SomeModel.objects.all().values('id', 'title')])
...