django怎么实现模糊查询(2023年最新解答)

如题所述

第1个回答  2024-09-05

导读:今天首席CTO笔记来给各位分享关于django怎么实现模糊查询的相关内容,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

Django中使用model怎么查询不等于某个值的情况

Model是django项目的基础,如果一开始没有好好设计好,那么在接下来的开发过程中就会遇到更多的问题.然而,大多数的开发人员都容易在缺少思考的情况下随意的增加或修改model.这样做的后果就是,在接下来的开发过程中,我们不得不做出更多努力来修正这些错误.

因此,在修改model时,一定尽可能的经过充分的考虑再行动!以下列出的是我们经常用到的一些工具和技巧:

South,用于数据迁移,我们会在每个django项目中都用到.但到django1.7时,将会有django.db.migrations代替.

django-model-utils,用于处理常见的模式,例如TimeStampedModel.

django-extensions,主要用到shell_plus命令,该命令会在shell中自动载入所有的app的model

1.基本原则

第一,将model分布于不同的app中.如果你的django项目中,有一个app拥有超过20个model,那么,你就应当考虑分拆该app了.我们推荐每个app拥有不超过5个model.

第二,尽量使用ORM.我们需要的大多数数据库索引都能通过Object-Relational-Model实现,且ORM带给我们许多快捷方式,例如生成SQL语句,读取/更新数据库时的安全验证.因此,如果能使用简单的ORM语句完成的,应当尽量使用ORM.只有当纯SQL语句极大地简化了ORM语句时,才使用纯SQL语句.并且,在写纯SQL语句是,应当优先考虑使用raw(),再是extra().

第三,必要时添加index.添加db_index=True到model中非常简单,但难的是理解何时应该添加.在建立model时,我们事先不会添加index,只有当以下情况时,才会考虑添加index:

在所有的数据库查询中使用率在10%-25%时

或当有真实的数据,或能正确估计出使用index后的效果确实满意时

第四,注意model的继承.model的继承在django中需要十分小心,django提供了三种继承方式,1.abstractbaseclass继承(不要和Pyhton标准库的abc模块搞混),2.多表(multi-table)继承,3.proxymodel继承.下表罗列了这三种继承的优劣:

django的创造者和其他许多开发人员都认为,多表继承的方法不是一个良好的方法.因此我们强烈建议大家不要使用该方法.下面列举了一些常见的如何选择model继承的情形:

如果只有少数model拥有重复的field时,大可不必使用model继承,只需要在每个model中添加这些相同的field即可.

如果有足够的model拥有重复的field时,大多是情况下,可以使用abstractbaseclass继承,将相同的field提取到abstractbaseclass中.

Proxymodel继承很少被用到,和其他两种继承也有着许多不一样之处.

请不要使用多表(multi-table)继承,因为它既消耗资源又复杂,如果可以,尽量使用OneToOneFields和ForeignKeys代替.

django项目中,创建时间和修改时间这两个field是最用到的,下面给出一个abstractbaseclass继承的例子:

2.DjangoModel的设计

如何设计出好的djangomodel可能是最难也是最复杂的一个话题了,在此,我们看看一些基本的技巧吧:

a.规范化

我们首先建议了解数据库规范化(databasenormalization).如果你还不清楚这是什么,那么,我们强烈建议你先阅读一下相关的书籍,或搜索"关系型数据库设计"或"数据库规范化".在创建djangomodel之前,应当首先保证设计的数据库是规范化的.

b.cache

正确的使用cache能帮助我们提高数据库的性能.详细的信息,我们会在今后的文章中作进一步介绍.

c.何时使用null和blank

当定义modelfield时,我们可以设置null=True和blank=True(默认都是False),知道何时设置null和blank对于开发人员也是十分重要的,在下面的表格中,我们一一列举了如何使用这两个选项:

d.什么时候使用BinaryField

在django1.6中,新增了BinaryField,用于储存二进制数据(binarydata或bytes).对于BinaryField,我们无法使用ORM的filters,excludes或其他SQL操作.但在少数情况下,我们会用到BinaryField,例如MessagePack格式的内容,传感器接受的原始数据和压缩数据等.但需要注意的是,BinaryData一般都十分庞大,因此可能会拖慢数据库的速度.如果发生这一现象,我们可以将binarydata储存在文件中,然后使用FileField储存该文件的路径信息.

还有,不要从BinaryField中直接读取文件并呈献给用户.因为,1.从数据库读写总是比从文件系统读写慢;2.数据库备份会变得十分庞大,花费更多的时间;3.获得文件的过程,增加了从django到数据库的这一环节.

3.不要替换默认的ModelManager

从ORM获取model,实际上是通过django中的Modelmanager完成的,django为每一个model提供了默认的modelmanager,我们不建议将其替换掉,因为:

当使用model继承时,model会继承abstractbaseclassmodel的modelmanager,而不会继承非abstractbaseclass的manager.

model的第一个modelmanager通常作为默认的manager,当被替换时,可能会发生不可预测的问题.

4.数据库事务(Transaction)

在django1.6中,ORM默认会autocommit每一个数据库查询,也就是说,每次使用m.create()或m.update()时,在数据库中马上就会做出相应的修改.这样做的好处就是简化了初学者对ORM的理解.但坏处就是,当一个view中包含两个数据库修改,可能一个成功,但另一个失败,这就可能导致数据库不完整,给我们带来很大的危险.

解决这一问题的方法就是使用数据库transaction,即将一系列数据库操作包含在一个transaction中,当其中有一个失败时,其他操作也会自动回退.Django1.6为我们带来了一套崭新的既简单又强大的transaction机制,使我们方便的使用数据库transaction.

a.将整个httprequest包裹在transaction中

django给我们提供了一个简单地方法,将一个httprequest中的所有数据库操作包裹在transaction中:

只需要在数据库设置中加入'ATOMIC_REQUESTS':True选项,就能将整个httprequest包裹在transaction中.这样做的好处显而易见是是安全,但坏处则是性能可能会下降,因此随着流量的增大,我们必须采取更针对性的transaction.其次,需要注意的是,回退的只是数据库的状态,而不包括其他费数据库项,例如发送email等.所以当涉及这些非数据库项时,我们应当使用transaction.con_atomic_request()修饰(decorate)这些view:

b.更明确地transaction控制

更明确地transaction控制意味着提高真题webapp的性能,但也意味着更多的开发时间.大多数网站下,由于有限的流量,使用ATOMIC_REQUESTS已经足够.在使用手动transaction控制时,应当注意:

不做数据修改的操作,应当排除在transaction之外

做数据修改的操作,则应在transaction内

特殊情况下,可以违反以上两条

需要注意的是,当view返回的是django.http.StreamingHttpResponse时,应当设置ATOMIC_REQUESTS为false,或使用transaction.non_atomic_requests将该view修饰.因为对于view本身,是可以使用transaction的,但对于之后生成的responsestream触发的额外SQL查询,会自动变为django默认的autocommit模式.

求助django实现前端页面检索功能的代码

设我们的django博客应用有如下的文章模型:

blog/models.pyclassPost(models.Model):

#标题

title=models.CharField(max_length=70)

#正文

body=models.TextField()

#其他属性

def__str__(self):

returnself.title

先看到第1步,用户在搜索框输入搜索关键词,因此我们要在博客上为用户提供一个搜索表单,html表单代码大概像这样:

formmethod="get"action="/search/"

{%csrf_token%}inputtype="search"placeholder="搜索"required

buttontype="submit"搜索/button/form

特别注意在form标签下有一个{%csrf_token%},这是django用来防御跨站请求伪造(CSRF)攻击的机制。如果不知道什么是CSRF的话也没有关系,只要记住在使用django时,前端的表单代码里一定要加上{%csrf_token%}。

用户输入了搜索关键词并点击了搜索按钮后,数据就被发送给了django后台服务器。表单的action属性的值为/search/,表明用户提交的结果将被发送给/search/这个URL。我们为这个URL绑定一个django视图函数,在这个视图函数里完成前面第2步提到的过程。假设我们把视图函数的代码写在blog/views.py里:

blog/views.pydefsearch(request):

q=request.GET.get('q')

error_msg=''

ifnotq:

error_msg='请输入关键词'

returnrender(request,'blog/errors.html',{'error_msg':error_msg})

post_list=Post.objects.filter(title__icontains=q)

returnrender(request,'blog/results.html',{'error_msg':error_msg,

'post_list':post_list})

首先我们使用request.GET.get('q')获取到用户提交的搜索关键词。用户通过表单提交的数据django为我们保存在request.GET里,这是一个类似于Python字典的对象,所以我们使用get方法从字典里取出键q对应的值,即用户的搜索关键词。这里字典的键之所以叫q是因为我们的表单中搜索框input的name属性的值是q,如果修改了name属性的值,那么这个键的名称也要相应修改。

接下来我们做了一个小小的校验,如果用户没有输入搜索关键词而提交了表单,我们就无需执行查询,而是渲染一个错误页面提示用户请输入关键词。

如果用户输入了搜索关键词,我们就通过filter方法从数据库里过滤出符合条件的所有文章。这里的过滤条件是title__icontains=q,即title中包含(contains)关键字q,前缀i表示不区分大小写。这里icontains是查询表达式(Fieldlookups),其用法是在模型需要筛选的属性后面跟上两个下划线。django内置了很多查询表达式,建议过一遍django官方留个印象,了解每个表达式的作用,以后碰到相关的需求就可以快速定位到文档查询其用途:Fieldlookups

接下来就是渲染搜索结果页面,显示符合搜索条件的文章列表,下面是一个模板的简单示例:

results.html

{%iferror_msg%}p{{error_msg}}/p{%endif%}

{%forpostinpost_list%}div

在这里显示文章的相应信息/div{%empty%}divclass="no-post"

没有搜索到符合条件的文章/div{%endfor%}

有了视图函数后记得把视图函数映射到相应了URL,前面我们表单数据提交的URL为/search/,因此将视图函数search绑定到该URL上。

blog/urls.pyurlpatterns=[

#其他url配置

url(r'^search/$',views.search,name='search'),]

大功告成!

django怎么模糊匹配json中的数据?

1、JSON_EXTRACT并不是精确匹配,是抽出JSON文档数据。例如你存的的人名“王五”这个函数就会返回"王五",然后给JSON_CONTAINS函数用作和后面CASTASJSON语句的结果值比较。所以django解析成这样的sql语句其实并没有问题。

2、无法模糊匹配的主要问题在于后半句CAST(''ASJSON),我也存在同样的疑问,这个函数为啥不能直接模糊匹配value值。官方文档似乎也没有相应的解释

3、你可以将姓和名拆开存储,然后搜索姓=王即可。

结语:以上就是首席CTO笔记为大家介绍的关于django怎么实现模糊查询的全部内容了,希望对大家有所帮助,如果你还想了解更多这方面的信息,记得收藏关注本站。

logo设计

创造品牌价值

¥500元起

APP开发

量身定制,源码交付

¥2000元起

商标注册

一个好品牌从商标开始

¥1480元起

公司注册

注册公司全程代办

¥0元起

    官方电话官方服务
      官方网站八戒财税知识产权八戒服务商企业需求数字市场
相似回答
大家正在搜