Django admin 实现search_fields精确查询实例

下面是实现 Django admin 的 search_fields 完整攻略:

1. 在 ModelAdmin 中配置 search_fields

在 Django 中,我们可以通过 ModelAdmin 对象来配置 search_fields 属性实现模糊查询,但是使用该属性执行的是 SQL 中 LIKE 操作,未做查询词的规范化。

如果我们希望在 Django admin 中实现精确查询,则需要重写 ModelAdmin 中的 get_search_results 方法。步骤如下:

  1. 创建自定义的 ModelAdmin 类,继承 Django 提供的 admin.ModelAdmin
  2. 在自定义的 ModelAdmin 类中重写 get_search_results 方法
  3. get_search_results 方法中,使用原有的模糊查询语句进行查询,然后过滤出符合精确查询条件的结果,返回结果给前端即可

示例代码:

from django.contrib import admin
from myapp.models import Book

class BookAdmin(admin.ModelAdmin):
    search_fields = ('title', 'author', 'publisher', 'category')

    def get_search_results(self, request, queryset, search_term):
        queryset, use_distinct = super().get_search_results(request, queryset, search_term)

        # 对所有查询词使用精确匹配
        for term in search_term.split():
            queryset = queryset.filter(title__iexact=term)
            queryset = queryset.filter(author__iexact=term)
            queryset = queryset.filter(publisher__iexact=term)
            queryset = queryset.filter(category__iexact=term)

        return queryset, use_distinct

admin.site.register(Book, BookAdmin)

在上面的代码中,我们创建了 BookAdmin 类,并重写了 get_search_results 方法,对查询词使用精确匹配。这意味着,例如搜索 Programming in Python 关键词时,该方法仅会返回保存 titleauthorpublishercategory 准确为 Programming in Python 的结果。

2. 自定义模糊查询的边界

以上示例的方法是对所有查询词都使用精确匹配,这样会抛弃掉模糊匹配的优点,对于一些场合,我们需要使用一些边界来处理模糊匹配。

例如,假设我们要搜索以给定字符串起始的字符串,我们可以使用以下示例代码:

from django.contrib import admin
from myapp.models import Book

class BookAdmin(admin.ModelAdmin):
    search_fields = ('title', 'author', 'publisher', 'category')

    def get_search_results(self, request, queryset, search_term):
        queryset, use_distinct = super().get_search_results(request, queryset, search_term)

        # 对所有查询词使用边界规则匹配
        for term in search_term.split():
            lookup = '__startswith'
            if term.endswith('*'):
                term = term[:-1]
            else:
                lookup = '__iexact'
            queryset = queryset.filter(title + lookup=term)
            queryset = queryset.filter(author + lookup=term)
            queryset = queryset.filter(publisher + lookup=term)
            queryset = queryset.filter(category + lookup=term)

        return queryset, use_distinct

admin.site.register(Book, BookAdmin)

在上述代码中,我们通过增加一个 lookup 变量,并根据情况使用 __iexact__startswith 进行模糊查询。例如搜索字符串 Python* 时会使用前缀匹配来寻找以 Python 开头的字符串.

以上就是 Django admin 实现 search_fields 精确查询的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django admin 实现search_fields精确查询实例 - Python技术站

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

相关文章

  • ubuntu 18.04 安装opencv3.4.5的教程(图解)

    下面我会详细讲解“Ubuntu 18.04安装OpenCV 3.4.5的教程(图解)”。 1. 下载OpenCV安装包 首先,从OpenCV官网https://opencv.org/releases/下载OpenCV 3.4.5版本。我们选择的是源码形式的安装包。 2. 安装依赖库 在安装OpenCV前,需要先安装一些必要的依赖库,可以通过以下命令完成: s…

    人工智能概览 2023年5月25日
    00
  • Opencv创建车牌图片识别系统方法详解

    Opencv创建车牌图片识别系统方法详解 Opencv是一个强大的计算机视觉库,可以轻松实现各种图像处理任务,包括车牌图片识别系统。要创建一个Opencv车牌图片识别系统,可以按照以下步骤进行。 步骤一:收集和准备训练数据集 在创建车牌图片识别系统之前,需要先收集并准备训练数据集。训练数据集应该包括正常的车牌图片和各种异常情况下(例如模糊、倾斜、阴影、遮挡等…

    人工智能概览 2023年5月25日
    00
  • Python办公自动化SFTP详解

    Python办公自动化SFTP详解 在实际的工作场景中,经常需要将本地计算机的文件上传或下载到远程的服务器,这时sftp协议就变得非常实用了。Python语言提供了一种ubd-ftp库来操作sftp协议,Python办公自动化中的sftp常用于上传、下载、删除远程服务器上的文件。 连接SFTP服务器 首先,需要使用以下语句导入相关的库: import par…

    人工智能概论 2023年5月25日
    00
  • 使用OpenCV实现人脸图像卡通化的示例代码

    使用OpenCV实现人脸图像卡通化的示例代码的实现过程可以分为以下几个步骤: 1. 加载图片 我们首先需要加载图片作为我们要卡通化的对象。通过OpenCV的cv2.imread()函数,我们可以很方便地从磁盘中加载图片,例如: import cv2 # 加载图片 img = cv2.imread("path_to_image") 2. 灰…

    人工智能概论 2023年5月25日
    00
  • Windows下的Jupyter Notebook 安装与自定义启动(图文详解)

    Windows下的Jupyter Notebook 安装与自定义启动(图文详解) Jupyter Notebook 是一个非常流行的交互式笔记本,它支持多种编程语言,包括 Python、R、Julia 等。在本文中,我们将讲解如何在 Windows 上安装并自定义启动 Jupyter Notebook。 安装Anaconda 要安装 Jupyter Note…

    人工智能概览 2023年5月25日
    00
  • Django动态随机生成温度前端实时动态展示源码示例

    以下是详细的讲解“Django动态随机生成温度前端实时动态展示源码示例”的完整攻略。 简介 本攻略将通过Django框架实现动态随机生成温度并通过前端实时动态展示,主要包含以下步骤: 创建Django项目并创建渲染模板 后端实现动态随机生成温度并将结果传递至渲染模板 前端实现实时动态展示温度 步骤一:创建Django项目及模板 首先需要创建一个Django项…

    人工智能概览 2023年5月25日
    00
  • Python开发微信公众平台的方法详解【基于weixin-knife】

    Python开发微信公众平台的方法详解【基于weixin-knife】 简介 本文将介绍如何使用Python开发微信公众平台。我们使用的是名为weixin-knife的Python库,该库提供了高层的API让我们更容易地与微信服务器交互。本文将提供具体的步骤来实现微信公众平台的开发。如果您还不了解什么是微信公众平台,您可以先阅读官方文档(https://mp…

    人工智能概览 2023年5月25日
    00
  • FreeBSD 6.2 安装全程图解教程

    FreeBSD 6.2 安装全程图解教程 准备工作 下载 FreeBSD 6.2 ISO 镜像文件; 制作启动盘或者启动 U 盘。 安装步骤 首先,在计算机 BIOS 中设置从制作好的启动盘或者启动 U 盘启动。 示例:对于大部分品牌的计算机,可以在开机时按 F2、F10、F12 等键,并进入 Boot Options 或者 Boot Menu 来进行设置。…

    人工智能概览 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部