Django分页查询并返回jsons数据(中文乱码解决方法)

yizhihongxing

下面详细解释一下如何在Django中进行分页查询并返回JSON格式的数据,并解决中文乱码问题。

1. 安装相关依赖库

首先需要安装以下两个库:

  • django-pure-pagination (https://pypi.org/project/django-pure-pagination/)
  • django-core-extensions (https://pypi.org/project/django-core-extensions/)

可以使用pip进行安装:

pip install django-pure-pagination django-core-extensions

2. 修改settings配置

在settings.py中添加以下配置:

INSTALLED_APPS = [
    # ...
    'pure_pagination',
    'core_extensions',
]

# Pagination settings
PAGINATION_SETTINGS = {
    'PAGE_RANGE_DISPLAYED': 5,
    'MARGIN_PAGES_DISPLAYED': 2,
    'SHOW_FIRST_PAGE_WHEN_INVALID': True,
}

3. 创建分页处理类

在app目录下创建一个pagination.py文件,添加以下代码:

from pure_pagination import Paginator, PageNotAnInteger

class PaginationHandler():

    def __init__(self, request, queryset, page_size=10, prefetch_related=None, select_related=None):
        self.request = request
        self.queryset = queryset
        self.page_size = page_size
        self.prefetch_related = prefetch_related
        self.select_related = select_related

    def get_paginated_data(self):
        page = self.request.GET.get('page', 1)

        # 如果传进来的数据中有额外的关联表,使用select_related和prefetch_related优化查询速度
        queryset = self.queryset
        if self.prefetch_related:
            queryset = queryset.prefetch_related(*self.prefetch_related)
        if self.select_related:
            queryset = queryset.select_related(*self.select_related)

        paginator = Paginator(queryset, self.page_size, request=self.request)

        try:
            data = paginator.page(page)
        except PageNotAnInteger:
            data = paginator.page(1)
        except Exception:
            data = []

        return {
            'current_page': data.number,
            'total_pages': paginator.num_pages,
            'has_previous': data.has_previous(),
            'has_next': data.has_next(),
            'previous_page_number': data.previous_page_number(),
            'next_page_number': data.next_page_number(),
            'object_list': list(data),
        }

4. 编写视图函数

在views.py中定义视图函数,处理分页和JSON数据返回,例如:

from django.http import JsonResponse
from .models import Post
from .pagination import PaginationHandler

def post_list(request):
    data = Post.objects.all()

    # 获取分页处理类
    paginator = PaginationHandler(request, data)

    # 获取分页数据
    paginated_data = paginator.get_paginated_data()

    # 返回JSON格式数据
    return JsonResponse(paginated_data, safe=False)

5. 解决返回JSON数据中文乱码问题

在JSONResponse时需要加入参数json_dumps_params={'ensure_ascii':False},将ensure_ascii设置为False,以解决中文乱码问题,例如:

return JsonResponse(paginated_data, json_dumps_params={'ensure_ascii':False}, safe=False)

至此,我们就完成了Django分页查询并返回JSON数据并解决中文乱码问题的完整攻略。

以下是示例代码:

分页处理类示例

from django.http import request
from django.test import TestCase

from .pagination import PaginationHandler
from .models import Post


class PaginationTestCase(TestCase):

    def setUp(self):
        for i in range(1, 16):
            Post.objects.create(title=f"Post {i}", body="body content...")

        self.request = request.HttpRequest()
        self.request.GET['page'] = 1

        self.handler = PaginationHandler(self.request, Post.objects.all())

    def test_paginator(self):
        paginated_data = self.handler.get_paginated_data()

        self.assertEqual(paginated_data['current_page'], 1)
        self.assertEqual(paginated_data['total_pages'], 2)
        self.assertEqual(paginated_data['has_previous'], False)
        self.assertEqual(paginated_data['has_next'], True)
        self.assertEqual(paginated_data['previous_page_number'], None)
        self.assertEqual(paginated_data['next_page_number'], 2)
        self.assertEqual(len(paginated_data['object_list']), 10)
        self.assertEqual(paginated_data['object_list'][0].title, 'Post 1')

    def test_select_related(self):
        paginated_data = PaginationHandler(self.request, Post.objects.all(), select_related=['user']).get_paginated_data()

        self.assertEqual(len(paginated_data['object_list']), 10)
        self.assertEqual(paginated_data['object_list'][0].user.username, 'admin')

    def test_prefetch_related(self):
        paginated_data = PaginationHandler(self.request, Post.objects.all(), prefetch_related=['comments']).get_paginated_data()

        self.assertEqual(len(paginated_data['object_list']), 10)
        self.assertEqual(len(paginated_data['object_list'][0].comments.all()), 2)

视图函数示例

from django.http import JsonResponse
from .models import Post
from .pagination import PaginationHandler

def post_list(request):
    data = Post.objects.all()

    # 获取分页处理类
    paginator = PaginationHandler(request, data)

    # 获取分页数据
    paginated_data = paginator.get_paginated_data()

    # 返回JSON格式数据
    return JsonResponse(paginated_data, json_dumps_params={'ensure_ascii':False}, safe=False)

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django分页查询并返回jsons数据(中文乱码解决方法) - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • python中sleep函数用法实例分析

    下面是针对“Python中sleep函数用法实例分析”的完整攻略。 sleep函数的作用介绍 time模块中提供了sleep函数,可以让程序暂停执行一段指定的时间。其中,括号中的参数是指暂停时间,以秒为单位。例如:time.sleep(2)表示暂停执行2秒。 sleep函数的用法示例一 下面的示例演示了在控制台输出“I’m sleeping for 2 se…

    python 2023年6月3日
    00
  • 在Python的struct模块中进行数据格式转换的方法

    Python的struct模块是用于在C和Python数据类型之间进行转换的模块。该模块允许你在二进制数据和Python数据类型之间进行相互转换。 1. 使用struct模块进行数据格式转换的方法 下面是使用Python的struct模块进行数据格式转换的方法: 1.1 将Python数据转换为二进制数据 首先,你可以使用struct模块的pack方法来将P…

    python 2023年5月31日
    00
  • Python 遍历循环详细

    Python遍历循环详细攻略 在Python中,遍历循环是一种常用的循环方式。它允许我们逐个访问序列中的每个元素,并对其进行处理。本文将带你了解Python中常用的遍历循环方式,包括for循环和while循环。 for循环 for循环是Python中最常用的循环方式,它可以遍历任何序列类型,如列表、元组、字符串、字典等。 遍历列表 下面是一个遍历列表的示例代…

    python 2023年5月13日
    00
  • pip报错“ValueError: invalid literal for int() with base 10: ‘python3’”怎么处理?

    当使用 pip 安装 Python 包时,可能会遇到 “ValueError: invalid literal for int() with base 10: ‘python3′” 错误。这个错误通常是由于 pip 安装过程中出现问题导致的。以下是细讲解 pip 报错 “ValueError: invalid literal for int() with b…

    python 2023年5月4日
    00
  • Python中使用socket发送HTTP请求数据接收不完整问题解决方法

    一、问题背景 在Python中使用socket发送HTTP请求时,因为HTTP协议是基于TCP协议的,其中包含的数据长度可能会非常长,因此数据不一定会一次性接收完毕,导致在接收数据时,可能出现接收不完整的情况。这时候就需要采用一些方法来解决这个问题。 二、问题解决方法 循环接收数据 我们可以循环接收数据,直到接收完整个响应,可以使用一个while循环来完成,…

    python 2023年6月3日
    00
  • Python利用pptx操作PPT实现幻灯片的删除与替换

    Python利用pptx操作PPT实现幻灯片的删除与替换攻略 前置条件 Python 3.x python-pptx库 安装python-pptx 可以使用pip命令来安装python-pptx库: pip install python-pptx 删除幻灯片 在Python中删除幻灯片的方法如下: from pptx import Presentation …

    python 2023年6月3日
    00
  • 有关Python的22个编程技巧

    有关 Python 的 22 个编程技巧 Python 是一种非常流行的编程语言,拥有丰富的库和工具包,可以应用于各种领域的开发工作。在本文中,我将为大家介绍一些 Python 编程技巧,帮助你更高效地编写代码。 技巧1:使用列表推导式 列表推导式是一种简单而强大的 Python 特性。通过使用列表推导式,可以快速创建列表。以下是一个简单的例子: numbe…

    python 2023年5月14日
    00
  • Python接口自动化浅析pymysql数据库操作流程

    下面我来为你详细讲解“Python接口自动化浅析pymysql数据库操作流程”的完整攻略。 Python接口自动化浅析pymysql数据库操作流程 1. 什么是pymysql PyMySQL是Python连接操作MySQL数据库的库。PyMySQL使用纯Python编写,而MySQLdb是C扩展。 2. pymysql安装 2.1 安装pymysql 可以通…

    python 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部