Возвращение набора запросов в формате json в Django
Я хотел получить ваш совет.
У меня есть нижеприведенный вариант, который возвращает нужные мне данные.
Однако, чтобы я мог использовать ajax для обновления страницы без обновления, мне нужно иметь возможность возвращать результаты в виде JSON. Я продолжаю получать ошибки о том, что результат запроса не является сериализуемым.
Кто-нибудь знает, как это сделать?
Большое спасибо!
open_tasks = skills.objects.filter(creator=request.user).raw('''
SELECT *,
round((closed_points/(open_points + closed_points)*100),2) as points_pct,
round((closed_count/(open_count + closed_count)*100),2) as closed_pct
from (
SELECT id, coalesce(sum(open_points),0) as open_points, coalesce(sum(closed_points),0) as closed_points,
coalesce(sum(open_count),0) as open_count, coalesce(sum(closed_count),0) as closed_count
from (
SELECT id,
case when status = 'open' then sum(points) end as open_points,
case when status <> 'open' then sum(points) end as closed_points,
case when status = 'open' then sum(count) end as open_count,
case when status <> 'open' then sum(count) end as closed_count
from (
SELECT category as id, status, sum(cast(points as int)) as points, count(*) as count
FROM voxi_skills
WHERE creator = %s
group by category, status)s
group by id, status)p
group by id)j
''', [request.user.username])
Одним из способов сделать это может быть создание метода serialize()
на объекте, который вы хотите сериализовать в строку JSON. Затем вы можете использовать встроенный в Django объект JsonResponse для возврата данных в виде строки JSON.
Например, если бы я хотел вернуть объект Book
в формате JSON, я мог бы написать код для класса Book
следующим образом:
from django.db import models
import uuid
class Book(models.Model):
id = models.UUIDField(
primary_key=True,
default=uuid.uuid4,
editable=False
)
title = models.CharField(
max_length=250,
null=False,
blank=False
)
author = models.CharField(
max_length=250,
null=False,
blank=False
)
def serialize(self):
return {
"id": self.id,
"title": self.title,
"author": self.author
}
Затем, в рамках моего представления, я могу вернуть объект Book
в формате JSON, используя следующий код:
from django.http import JsonResponse
def books(request):
if request.method == "GET":
books = Book.objects.all()
return JsonResponse([book.serialize() for book in books], safe=False)
Приведенное выше представление должно возвращать мои Book
объекты как данные JSON, аналогично следующему:
[
{
"id": <some_guid>,
"title": <some_title>,
"author": <some_author>
},
{
"id": <some_guid>,
"title": <some_title>,
"author": <some_author>
}
]
Дополнительная информация:
- Документация по объекту JsonResponse в Django: https://docs.djangoproject.com/en/3.2/ref/request-response/#jsonresponse-objects .