导读:很多朋友问到关于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模式.
如何在djangoshell中查看执行的数据库sql语句
C#中执行SQL语句//SQL查询语句publicDataTablequery(stringsql){//server=127.0.0.1;DataTabledt=newDataTable();//DataRowdr;stringconnString="server=127.0.0.1;uid=sa;pwd=;database=TJPTTC";SqlConnectionconn=newSqlConnection(connString);SqlDataAdapteradapter=newSqlDataAdapter(sql,conn);adapter.Fill(dt);returndt;}//SQL非查询语句publicvoidnoQuery(stringsql){//server=127.0.0.1;stringconnString="server=GLASSESONION;uid=sa;pwd=;database=TJPTTC";SqlConnectionconn=newSqlConnection(connString);SqlCommandcmd=newSqlCommand(sql,conn);conn.Open();cmd.ExecuteNonQuery();conn.Close();}
django怎么判断数据库的记录是否存在我觉得楼上的回答好像有点问题。大家可以自行验证一下我是否正确。
用get查询的时候,查询不到内容的时候会抛出异常,同样查询结果多余1条的时候也会抛出异常。因此,不能使用get,而应该使用filter。
filer若是查询不到数据,会返回一个空的查询集,[]?type类型是:Queryset。
查询到多余一条的时候会,还是会返回一个包含多个对象的查询集。
所有用filter查询到的是否为'[]'来判断是否存在。
userinfo?=?Users.objects.filter(email?=?request.POST['email'])
if?userinfo.exists():
????print("yes,we?have?this?email")
else:
???print("sorry,email?is?not?register")
另外还可以使用count()这个方法,userinfo.count()=0的话表示不存在数据,大于0的话表示存在一条或多条。
还有就是楼上的答案:ifuerinfo:..........else:.......
djangoORM怎样判断数据库中的表是否已经存在?Djangomakemigration和Djangomigrate会保证Django管理的表一定是存在的。
(不要忘记执行这两个manage命令就行了,使用pythonmanage.py可以看帮助)
如果是外部表(managed=False),可以使用数据库连接构造查询表的SQL去测试。
django中怎么使用两个限定条件在mysql数据库中进行查询可以使用逻辑关系运算符
例如:
SELECT*FROMtable_name
WHERE(条件1and条件2)查询两个条件都符合的结果,
或者
SELECT*FROMtable_name
WHERE(条件1or条件2)查询符合两个条件中满足任一条件的结果。
django从数据库查找空的数据怎么处理1、代码文件第一行加编码定义了吗?比如如下:
1
#coding:utf-8
2、代码里面的中文字符串前面最好加u,比如:
1
students.objects.filter(sex=u'男')
3、Django技术栈下所有的编码都是unicode,所以你在json.dupm哪儿做的编码设置有点突兀。
结语:以上就是首席CTO笔记为大家整理的关于django怎么查询一个为空的数据库的相关内容解答汇总了,希望对您有所帮助!如果解决了您的问题欢迎分享给更多关注此问题的朋友喔~
logo设计
创造品牌价值
¥500元起
APP开发
量身定制,源码交付
¥2000元起
商标注册
一个好品牌从商标开始
¥1480元起
公司注册
注册公司全程代办
¥0元起
查
看
更
多