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日

相关文章

  • 微信小程序的数据存储与Django等服务发送请求 讲解

    微信小程序与Django服务的数据交互 简介 微信小程序前端作为一种新的应用程序开发模式,可以通过小程序内部的API进行页面跳转、数据请求与显示等操作。而服务端则可以通过不同的服务框架,如Django、Flask等提供接口供前端进行数据交互。数据交互的方式有多种,本文将主要讲解通过小程序的 wx.request() 发送 HTTP 请求,从而与 Django…

    人工智能概论 2023年5月25日
    00
  • Django验证码的生成与使用示例

    下面是关于“Django验证码的生成与使用示例”的完整攻略。 1. 生成验证码 在Django中,我们可以使用django-simple-captcha库来生成验证码。django-simple-captcha是一个轻量级的Django验证码应用,没有太多繁琐的设置,易于使用。 首先,需要安装django-simple-captcha库,可以通过以下命令实现…

    人工智能概论 2023年5月25日
    00
  • Django项目中使用JWT的实现代码

    下面是关于Django项目中使用JWT的实现代码的完整攻略,包括最基本的JWT的使用和带有自定义用户模型的JWT使用: 基本JWT的使用 步骤1:安装相关库 在Django项目中使用JWT,需要安装两个Python库:pyjwt和django-rest-framework-jwt,可以使用以下命令进行安装: pip install pyjwt pip ins…

    人工智能概论 2023年5月25日
    00
  • django中账号密码验证登陆功能的实现方法

    好的。下面是django中账号密码验证登陆功能的实现方法: 1. 通过Django内置的auth应用实现账号密码验证登陆 Django自带的auth应用提供了一个名为authenticate()的函数,可以用于验证用户的账号和密码是否匹配。下面是一个简单的示例: from django.contrib.auth import authenticate, lo…

    人工智能概论 2023年5月25日
    00
  • linux编程之pipe()函数详解

    Linux编程之pipe()函数详解 在Linux编程中,pipe()是一个重要的函数,用于在两个进程之间创建一个管道,从而实现进程间通信。本文将详细讲解pipe()函数的使用方法、注意事项及示例说明。 管道的创建 调用pipe()函数可以创建一个管道,该函数的原型如下: #include <unistd.h> int pipe(int pipe…

    人工智能概览 2023年5月25日
    00
  • c++ 读写yaml配置文件

    标题:C++读写YAML配置文件完整攻略 简介 YAML是一种人类可读的数据序列化格式,通常用于配置文件、数据交换、日志记录等。本文将介绍如何在C++中读写YAML配置文件的完整攻略。 依赖 yaml-cpp:一个C++的YAML解析库,用于读写YAML格式文件,可以在官网(https://github.com/jbeder/yaml-cpp)上下载。 基本…

    人工智能概览 2023年5月25日
    00
  • Python Opencv中获取卷积核的实现代码

    获取卷积核可以通过在Python Opencv中使用getStructuringElement函数来实现。该函数用于获取不同形状和大小的结构元素或卷积核。 具体实现如下: 1. 获取矩形卷积核 如下为实现获取3*3矩形卷积核的代码示例: import cv2 kernel_rect = cv2.getStructuringElement(cv2.MORPH_…

    人工智能概论 2023年5月24日
    00
  • nginx php-fpm环境中chroot功能的配置使用方法

    首先,我们来介绍一下chroot的概念。chroot,即“change root”,是指将进程的根目录改变为指定的目录。在nginx php-fpm环境中配置chroot,可以限制php-fpm进程的访问范围,提高服务器的安全性。 下面是nginx php-fpm环境中chroot功能的配置使用方法: 配置nginx 修改nginx的配置文件,将root指令…

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