Django serialize queryset.values ​​() в json

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

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

Это мой код:

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

Ответы

Ответ 1

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

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

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

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

Ответ 2

Как говорили другие люди, Django сериализаторы не могут обрабатывать ValuesQuerySet. Однако вы можете сериализовать, используя стандартный json.dumps() и преобразовать свой ValuesQuerySet в список, используя list(). Если ваш набор включает поля Django, такие как Decimals, вам нужно будет передать 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)

Ответ 3

Сделать список из объекта objectQuerySet:

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

Ответ 4

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

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