Возвращение набора запросов в формате 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>
    }
]

Дополнительная информация:

Вернуться на верх