Этот код прекрасно работает, если я захожу в / mypath.
Я копирую и вставляю ваш код, и он поднял TypeError
точно так же, как этот пост, Объект Django не сериализуем в JSON
Я не думаю, что это что-то не так с вашим тестовым клиентом.Измените views.py
, как показано ниже, и попробуйте снова.
<b>from django.http.response import JsonResponse
from django.core import serializers
import json</b>
def get_all_models(request):
<b>data = serializers.serialize('json', MyModel.objects.all(), fields=('user', 'name'))</b>
return JsonResponse({"models": <b>json.loads(data)</b>})
Этот фрагмент даст ответ JSON, как показано ниже:
{
"models": [
{
"model": "account.mymodel",
"pk": 1,
"fields": {
"user": 74,
"name": "jerin"
}
},
{
"model": "account.mymodel",
"pk": 2,
"fields": {
"user": 66,
"name": "peter"
}
}
]
}
Почему json.loads()
??
Сериализованный выходной файл будет в строке , мы должны изменить его иначе, Jsonresponse будет строкой вместо Json
In [1]: from account.models import MyModel
In [2]: from django.core import serializers
In [3]: data = serializers.serialize('json', MyModel.objects.all(), fields=('user', 'name'))
In [4]: data
Out[4]: '[{"model": "account.mymodel", "pk": 1, "fields": {"user": 74, "name": "jerin"}}, {"model": "account.mymodel", "pk": 2, "fields": {"user": 66, "name": "peter"}}]'
In [5]: type(data)
Out[5]: str
In [6]: import json
In [7]: data_new = json.loads(data)
In [8]: data_new
Out[8]:
[{'model': 'account.mymodel',
'pk': 1,
'fields': {'user': 74, 'name': 'jerin'}},
{'model': 'account.mymodel',
'pk': 2,
'fields': {'user': 66, 'name': 'peter'}}]
In [9]: type(data_new)
Out[9]: list
Подробнее о Сериализация объектов Django / QuerySets
UPDATE-1
Почему это не работает из коробки?Кажется неудобным в использовании.
Я не вижу здесь никакого нестандартного метода.Потому что все кажется хорошим, как в Pythonic, так и в Django (мой ответ).
От здесь, мы могли бы понять, что такое чистый JSON.
Объект - это неупорядоченный набор пар имя / значение.Объект начинается с {
(левая скобка) и заканчивается }
(правая скобка).Каждое имя сопровождается :
(двоеточие), а пары имя / значение разделяются ,
(запятая).
В вашем операторе вы пытаетесь вернуть {"models": list(MyModel.objects.all())}
, что dict
, но не JSON
.
Ага ... внешние слои являются точными, поэтому это может быть JSON Array .Но содержимое массива: QuerySets , что не является значением в соответствии с этим содержимым
UPDATE-2
Я нашел обходной путь для передачи объектов в класс сериализатора.Создайте функцию, как показано ниже,
from django.core import serializers
def serialize_dup(format, queryset, **options):
<b>try:
iter(queryset)
except TypeError:
queryset = [queryset]</b>
return serializers.serialize(format, queryset, **options)
и используйте эту функцию serialize_dup()
как обычно serializers.serialize()
Update-3
Как указано в комментариях @ fush , можно вернуть ответ JSON, если сериализовать объекты модели с format='python'
# code sample
from django.http.response import JsonResponse
from django.core import serializers
def get_all_models(request):
data = serializers.serialize(<b>'python',</b> MyModel.objects.all(), fields=('user', 'name'))
return JsonResponse({"models": data})