django怎么实现查询某个值(django条件查询)
导读:很多朋友问到关于django怎么实现查询某个值的相关问题,本文首席CTO笔记就来为大家做个详细解答,供大家参考,希望对大家有所帮助!一起来看看吧!
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模式.
pythondjango查询mysql表字段的最大值
如果你的表是用模型建立的话,类似这样
classPerson(models.Model):
qq=models.CharField(max_length=100)
要取Person模型中的id最大值的话,可以使用a=Person.objects.latest('id'),这样取到的是对应最大id的一个模型,a.id就是你要的值,然后a.qq就是最大id的qq号码
求助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中复杂的查询在上面所有的例子中,我们构造的过滤器都只是将字段值与某个常量做比较。如果我们要对两个字段的值做比较,那该怎么做呢?
Django提供F()来做这样的比较。F()的实例可以在查询中引用字段,来比较同一个model实例中两个不同字段的值。
Django支持F()对象之间以及F()对象和常数之间的加减乘除和取模的操作。
filter()等方法中的关键字参数查询都是一起进行“AND”的。如果你需要执行更复杂的查询(例如OR语句),你可以使用Q对象。
fromdjango.db.modelsimportQ
Q(title__startswith='Py')
Q对象可以使用和|操作符组合起来。当一个操作符在两个Q对象上使用时,它产生一个新的Q对象。
查询名字叫水浒传或者价格大于100的书
你可以组合和|操作符以及使用括号进行分组来编写任意复杂的Q对象。同时,Q对象可以使用~操作符取反,这允许组合正常的查询和取反(NOT)查询:
查询函数可以混合使用Q对象和关键字参数。所有提供给查询函数的参数(关键字参数或Q对象)都将"AND”在一起。但是,如果出现Q对象,它必须位于所有关键字参数的前面。例如:
查询名字叫水浒传与价格大于100的书
django获取POST请求值的几种方法1、django获取post过来的多个键值对:
Ajax:
varlanguages={};
languages['english']=['mark','james'];
languages['spanish']=['amy','john'];
$.ajax({
type:'POST',
url:'/save/',
data:languages,
dataType:'json'
});
DjangoViews.py
ifrequest.is_ajax()andrequest.method=='POST':
forkeyinrequest.POST:
printkey
valuelist=request.POST.getlist(key)
printvaluelist
---------------------
fiddle:
name=june;age=26;
---------------------
views.py
16forkeyinrequest.POST:17printkey18valuelist=request.POST.getlist(key)19printvaluelist
----------------------------
DevelopmentserverisrunningatQuittheserverwithCONTROL-C.YourmethodisPOST!name[u'june']
age[u'26'][04/Apr/201210:58:11]"POST/getuin/HTTP/1.1"20020
2、一次加载所有值:
defview_example(request):
data=simplejson.loads(request.raw_post_data)
3、获取多个值作为一个列表
request.POSTgetmultiplevalues
TheQueryDict.getlist()allowstogetallthecheckbox(orselectlist)valuesfromtherequest.POST/GETobject.
Let’sassumewehaveasimpleformwiththefollowingcheckboxes.EachcheckboxcontainsanIDofanartist.1formmethod="post"action=""2...3inputvalue="1"name="artists"type="checkbox"4inputvalue="2"name="artists"type="checkbox"5inputvalue="3"name="artists"type="checkbox"6...7/form
Inviews.py:1defhandle(request):2ifrequest.method=='POST':3artists=request.POST.getlist('artists')#nowartistsisalistof[1,2,3]
结语:以上就是首席CTO笔记为大家介绍的关于django怎么实现查询某个值的全部内容了,希望对大家有所帮助,如果你还想了解更多这方面的信息,记得收藏关注本站。
海贼王全部人物名称
1、“草帽”蒙奇·D·路飞(モンキーD·ルフィ\/Monkey D. Luffy)由于他的标志性特征是一顶草帽,因此常被直接称呼为“草帽”。梦想是找到传说中的ONE PIECE,成为海贼王。性格积极乐观,爱憎分明且十分重视伙伴,对任何危险的事物都超感兴趣。看似白痴,却是一个大智若愚型的无愧船长之职的人。和...
海贼王 世界政府的资料
简介:20年前作为中将参与了屠魔令。是一个为了「正义」可以把任何人当牺牲品的人。炸毁避难船,只因里面藏有考古学家的可能。“大事件”中,执行海军元帅佛之战国的计谋,曾成功诱骗新世界海贼斯库亚多偷袭白胡子,后杀死火拳艾斯并烧掉白胡子半边脸。中将 1.名字:蒙奇·D·卡普 日文名:モンキー?
海贼王里面所有人的关系?
是个好伙伴。此后的罗宾、弗兰克、布鲁克是被路飞团感动、激励着向所期待末来前进的同伴关系,是一种相互尊重、欣赏、协助的同志感情,当然要比单纯的同志情更多信任和关怀。某吧里有这样一段文字:罗宾的出现的确让海贼图的气氛有了新的风格,我很喜欢看大家胡闹的时候罗宾姐姐在一旁幸福地笑。这种感觉...
关于海贼王较为详细的资料
在某个海岛小渔村长大。和暂驻在渔村的大海盗红发撒古斯感情很好,于是一心想成为海盗。眼下的疤痕就是为了显示自己够狠自己用刀划的(果然够狠,汗)。可是路飞7岁时糊里糊涂的吃了海盗们抢来的恶魔果实——橡皮果实(ゴムゴムの実),从此再也学不会游泳。这样还能成为海盗吗?路飞的答案是——只要...
海贼王中“海军官职是什么顺序”??
相当自大却又没本事的一个男人。后被海军上校媞娜收为部下。 2.名字:赞高 日文名:ジャンゴ 英文名:Jango 身份:黑猫海贼团副船长→海军本部三等兵 恶魔果实:无 武器:催眠环 简介:原为黑猫海贼团副团长,克洛船长的阴谋终结后被海军上校媞娜收为部下。是个催眠大师,可以把催眠对象变成狂暴状态。自己最...