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