导读:今天恰卡编程网来给各位分享关于django如何实现模糊查询的相关内容,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
django怎么模糊匹配json中的数据?
1、JSON_EXTRACT并不是精确匹配,是抽出JSON文档数据。例如你存的的人名“王五”这个函数就会返回"王五",然后给JSON_CONTAINS函数用作和后面CAST AS JSON语句的结果值比较。所以django解析成这样的sql语句其实并没有问题。
2、无法模糊匹配的主要问题在于后半句CAST('' AS JSON),我也存在同样的疑问,这个函数为啥不能直接模糊匹配value值。官方文档似乎也没有相应的解释
3、你可以将姓和名拆开存储,然后搜索姓=王即可。
Django 中使用model 怎么查询不等于某个值的情况
Model是django项目的基础, 如果一开始没有好好设计好, 那么在接下来的开发过程中就会遇到更多的问题. 然而, 大多数的开发人员都容易在缺少思考 的情况下随意的增加或修改model. 这样做的后果就是, 在接下来的开发过程中, 我们不得不做出更多努力来修正这些错误.
因此, 在修改model时, 一定尽可能的经过充分的考虑再行动! 以下列出的是我们经常用到的一些工具和技巧:
South, 用于数据迁移, 我们会在每个django项目中都用到. 但到django 1.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.abstract base class继承(不要和Pyhton标准库的abc模块 搞混), 2.多表(multi-table)继承, 3.proxy model继承. 下表罗列了这三种继承的优劣:
django的创造者和其他许多开发人员都认为, 多表继承的方法不是一个良好的方法. 因此我们强烈建议大家不要使用该方法. 下面列举了一些常见的如何 选择model继承的情形:
如果只有少数model拥有重复的field时, 大可不必使用model继承, 只需要在每个model中添加这些相同的field即可.
如果有足够的model拥有重复的field时, 大多是情况下, 可以使用abstract base class继承, 将相同的field提取到abstract base class 中.
Proxy model继承很少被用到, 和其他两种继承也有着许多不一样之处.
请不要使用多表(multi-table)继承, 因为它既消耗资源又复杂, 如果可以, 尽量使用OneToOneFields和ForeignKeys代替.
django项目中, 创建时间和修改时间这两个field是最用到的, 下面给出一个abstract base class继承的例子:
2. Django Model的设计
如何设计出好的django model可能是最难也是最复杂的一个话题了, 在此, 我们看看一些基本的技巧吧:
a. 规范化
我们首先建议了解数据库规范化(database normalization). 如果你还不清楚这是什么, 那么, 我们强烈建议你先阅读一下相关的书籍, 或搜索"关系 型数据库设计"或"数据库规范化". 在创建django model之前, 应当首先保证设计的数据库是规范化的.
b. cache
正确的使用cache能帮助我们提高数据库的性能. 详细的信息, 我们会在今后的文章中作进一步介绍.
c. 何时使用null和blank
当定义model field时, 我们可以设置null=True和blank=True (默认都是False), 知道何时设置null和blank对于开发人员也是十分重要的, 在下 面的表格中, 我们一一列举了如何使用这两个选项:
d. 什么时候使用BinaryField
在django 1.6中, 新增了BinaryField, 用于储存二进制数据(binary data或 bytes). 对于BinaryField, 我们无法使用ORM的filters, excludes或其他SQL操作. 但在少数情况下, 我们会用到BinaryField, 例如MessagePack格式的内容, 传感器接受的原始数据和压缩数据等. 但需要注意 的是, Binary Data一般都十分庞大, 因此可能会拖慢数据库的速度. 如果发生这一现象, 我们可以将binary data储存在文件中, 然后使用FileField储 存该文件的路径信息.
还有, 不要从BinaryField中直接读取文件并呈献给用户. 因为, 1. 从数据库读写总是比从文件系统读写慢; 2. 数据库备份会变得十分庞大, 花费更多 的时间; 3. 获得文件的过程, 增加了从django到数据库的这一环节.
3. 不要替换默认的Model Manager
从ORM获取model, 实际上是通过django中的Model manager完成的, django为每一个model提供了默认的model manager, 我们不建议将其替换掉, 因为:
当使用model继承时, model会继承 abstract base class model的model manager, 而不会继承非abstract base class的manager.
model的第一个model manager通常作为默认的manager, 当被替换时, 可能会发生不可预测的问题.
4. 数据库事务 (Transaction)
在django 1.6中, ORM默认会autocommit每一个数据库查询, 也就是说, 每次使用m.create()或m.update()时, 在数据库中马上就会做出相应的修 改. 这样做的好处就是简化了初学者对ORM的理解. 但坏处就是, 当一个view中包含两个数据库修改, 可能一个成功, 但另一个失败, 这就可能导致数据库不 完整, 给我们带来很大的危险.
解决这一问题的方法就是使用数据库transaction, 即将一系列数据库操作包含在一个transaction中, 当其中有一个失败时, 其他操作也会自动回退. Django 1.6 为我们带来了一套崭新的既简单又强大的transaction机制, 使我们方便的使用数据库transaction.
a. 将整个http request包裹在transaction中
django给我们提供了一个简单地方法, 将一个http request中的所有数据库操作包裹在transaction中:
只需要在数据库设置中加入'ATOMIC_REQUESTS': True选项, 就能将整个http request包裹在transaction中. 这样做的好处显而易见是是安全, 但 坏处则是性能可能会下降, 因此随着流量的增大, 我们必须采取更针对性的transaction. 其次, 需要注意的是, 回退的只是数据库的状态, 而不包括其他费 数据库项, 例如发送email等. 所以当涉及这些非数据库项时, 我们应当使用transaction.con_atomic_request()修饰(decorate)这些view:
b. 更明确地transaction控制
更明确地transaction控制意味着提高真题web app的性能, 但也意味着更多的开发时间. 大多数网站下, 由于有限的流量, 使用ATOMIC_REQUESTS已 经足够. 在使用手动transaction控制时, 应当注意:
不做数据修改的操作, 应当排除在transaction之外
做数据修改的操作, 则应在transaction内
特殊情况下, 可以违反以上两条
需要注意的是, 当view返回的是django.http.StreamingHttpResponse时, 应当设置ATOMIC_REQUESTS为false, 或使用 transaction.non_atomic_requests将该view修饰. 因为对于view本身, 是可以使用transaction的, 但对于之后生成的response stream触发的额 外SQL查询, 会自动变为django默认的autocommit模式.
求助django 实现前端页面检索功能的代码
设我们的 django 博客应用有如下的文章模型:
blog/models.pyclass Post(models.Model):
# 标题
title = models.CharField(max_length=70)
# 正文
body = models.TextField()
# 其他属性
def __str__(self):
return self.title
先看到第 1 步,用户在搜索框输入搜索关键词,因此我们要在博客上为用户提供一个搜索表单,html 表单代码大概像这样:
form method="get" action="/search/"
{% csrf_token %} input type="search" placeholder="搜索" required
button type="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.pydef search(request):
q = request.GET.get('q')
error_msg = ''
if not q:
error_msg = '请输入关键词'
return render(request, 'blog/errors.html', {'error_msg': error_msg})
post_list = Post.objects.filter(title__icontains=q)
return render(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 是查询表达式(Field lookups),其用法是在模型需要筛选的属性后面跟上两个下划线。django 内置了很多查询表达式,建议过一遍 django 官方留个印象,了解每个表达式的作用,以后碰到相关的需求就可以快速定位到文档查询其用途:Field lookups
接下来就是渲染搜索结果页面,显示符合搜索条件的文章列表,下面是一个模板的简单示例:
results.html
{% if error_msg %} p{{ error_msg }}/p{% endif %}
{% for post in post_list %} div
在这里显示文章的相应信息 /div{% empty %} div class="no-post"
没有搜索到符合条件的文章 /div{% endfor %}
有了视图函数后记得把视图函数映射到相应了 URL,前面我们表单数据提交的 URL 为 /search/,因此将视图函数 search 绑定到该 URL 上。
blog/urls.pyurlpatterns = [
# 其他 url 配置
url(r'^search/$', views.search, name='search'),]
大功告成!
Django表关联对象及多表查询
首先建立Student,Dpartment,Course,Stu_info表
一对多表关系数据的添加:
1.第一种方式就是跟之前的一样,用传参的方法添加,需要注意的是外键的值必须是关联表中已经存在的值.
2.第二种方式是用的属性赋值的方式,因为我们在模型类有定义了一个department的属性,而这个属性的对象的类型必须是department表的类实例对象
表关联对象的访问:
Student的模型类中我们有定义department的属性,所以当我们去访问的时候,可以直接通过student.department的形式去找到某个学生的所属学院是哪个.
那么如果我们也希望在在访问某个学院的实现对象的学生的时候改怎么访问呢???
表关联对象的访问:
可以在定义时设置related_name 参数来覆盖foo_set 的名称.
clear() 从关联的对象集中删除所有的对象
多表查询----跨关联关系的查询:
Django 提供一种强大而又直观的方式来“处理”查询中的关联关系,它在后台自动帮你处理JOIN。 若要跨越关联关系,只需使用关联的模型字段的名称,并使用双下划线分隔,直至你想要的字段:
它还可以反向工作。若要引用一个“反向”的关系,只需要使用该模型的小写的名称。
如何更新django中的一个模块
1,首先打开eclipse在主要的视图界面找到最上方的window点击,然后将看到showview的选项,然后在右边就会出现你要显示的视图。2,如果在这里边没有要显示的视图,可以点击other,那里边都有,可以根绝快速查询进行模糊查询,找到以后双击即可。3,可以再左下角上选择你需要显示的视图。那个大同小异,等选择了需要显示的视图后,可以拖拽控制它现实的位置。
django的group_by
django 的ORM中并没有单独的group_by方法,而是通过values + annotate的方式来实现group_by.
eg. 假如我们有个visit_record表. 记录网页每天的访问记录。
id | page_url | domain | pv | uv | date
通过(page_url, domain)唯一确定一个系统。
当values和annotate一起用的时候,values的字段就自动承担起了group_by的作用。 这个语句相当于:
需要注意与order_by一起用的时候,如果order_by的字段不在所选字段中或order_by字段是无效的会导致group_by不生效。
例如上述语句的order_by改成 order_by('-pv', 'id') 会导致语句变成 ... group by id 。
想一下应该可以理解,因为group_by按照page_url和domain聚合之后,得到的记录是多条记录的pv之和,不存在对应的是哪个id的记录,所以没法按照id排序,所以会导致group_by失效。
参见官方文档:
结语:以上就是恰卡编程网为大家整理的关于django如何实现模糊查询的相关内容解答汇总了,希望对您有所帮助!如果解决了您的问题欢迎分享给更多关注此问题的朋友喔~
相关文章
本站已关闭游客评论,请登录或者注册后再评论吧~