Django admin 实现search_fields精确查询实例

yizhihongxing

下面是实现 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日

相关文章

  • Python 局部变量global详解

    Python 局部变量 global 详解 在 Python 中,使用关键字 global 可以让程序中的局部变量在函数内外进行共享,从而起到对全局变量进行操作的效果。 global 的用法 在函数内部定义的变量,通常为局部变量。如果希望在函数外部对其进行操作,则需要在函数内部使用 global 关键字声明。 例如,在下面的代码中,我们使用函数 change…

    人工智能概览 2023年5月25日
    00
  • Pytorch distributed 多卡并行载入模型操作

    PyTorch是一个非常流行的深度学习框架,支持分布式多卡并行,可以利用多个GPU加速模型训练。在多卡并行训练时,载入模型操作是非常重要的一个环节。本文将详细讲解PyTorch中多卡并行载入模型的详细攻略。 1.使用torch.nn.DataParallel 首先,PyTorch提供了torch.nn.DataParallel模块,可以方便地实现多卡并行。对…

    人工智能概览 2023年5月25日
    00
  • 2023年人工智能12大应用趋势

    近几年我们正迎来人工智能技术市场需求及应用的蓬勃发展,很多人还没有意识到人工智能正在迅速而彻底地改变我们日常生活的方方面面。 本文将介绍2023年最需要了解的12种人工智能技术的应用领域,希望对所有关心人工智能发展走向的朋友带来参考和启发。 12大人工智能技术领域 机器人自动化流程 机器人流程自动化是人工智能技术应用的一大趋势。你可以将其理解成是对RPA的智…

    2022年11月14日
    10
  • JavaScript DOM 学习第五章 表单简介

    下面是本人对JavaScript DOM学习第五章 表单简介的完整攻略。本章主要讲解表单相关的知识点,包括表单的基本组成部分以及如何使用JavaScript对表单进行操作。 表单的基本组成部分 表单是由一组表单元素组成,包括文本输入框、密码输入框、单选框、复选框、下拉框、文件上传等。每个表单元素都有其独有的属性和方法,我们可以使用这些属性和方法对表单元素进行…

    人工智能概论 2023年5月25日
    00
  • 探究Nginx中reload流程的原理真相

    探究Nginx中reload流程的原理真相 在实际的应用场景中,我们经常会遇到需要修改Nginx配置文件的情况,那么如何实现这个过程中Nginx服务的平滑重启呢?从理论角度来说,Nginx的reload操作只是在不影响当前服务的情况下更新和重新加载配置文件。然而在实际操作中,这个过程并不总是平滑的。 以下是详细讲解Nginx中reload流程的原理真相的完整…

    人工智能概览 2023年5月25日
    00
  • Java的springcloud Sentinel是什么你知道吗

    Java的Spring Cloud Sentinel是一个分布式系统的流量管理框架,主要解决微服务架构中的流量控制、熔断降级、系统保护和实时监控等问题。Sentinel提供了实时的在线监控和告警机制,可以集成到Spring Cloud、Dubbo等开源框架中使用。 Spring Cloud Sentinel主要由三个基本概念组成:资源(Resource)、规…

    人工智能概览 2023年5月25日
    00
  • docker在win10家庭版下构建laravel开发环境的教程详解

    Docker在Win10家庭版下构建Laravel开发环境的教程详解 前言 Docker 是一个以容器为核心的虚拟化技术,是当前非常流行的技术之一。使用 Docker 可以轻松在不同的环境中运行应用程序,并且能够保证各种环境的一致性,避免了开发环境和生产环境不一致所导致的种种问题。 本文将介绍如何使用 Docker 构建一套 Laravel 开发环境,并在 …

    人工智能概览 2023年5月25日
    00
  • python利用百度云接口实现车牌识别的示例

    这里是关于“Python利用百度云接口实现车牌识别的示例”的完整攻略: 概述 本文将介绍如何通过Python代码调用百度云API实现车牌识别功能。我们需要先在百度云平台注册一个账号、创建应用并获取API Key和 Secret Key。车牌识别是基于图像的AI识别技术,在实现过程中,需要用到Python的基础语法和相关库的调用,例如:requests、bas…

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