浅谈在django中使用filter()(即对QuerySet操作)时踩的坑


Posted in Python onMarch 31, 2020

代码伺候:

先看如下代码:

例1:

  message = Message.objects.filter(pk=message_id2)
 
   message[0].id = message_id2
   message[0].content = content2
   message[0].message_type = message_type2
print(message[0].id)
print(message[0].content)
 
   message[0].save()

可正常从QuerySet中读取数据,并打印出来,无误。可是无法将数据同步到数据库中。

(1)all()返回的是QuerySet对象,程序并没有真的在数据库中执行SQL语句查询数据,但支持迭代,使用for循环可以获取数据。

例如有Book表,其包含bookname,booknum两个属性, 如何使用Objects.all(),得到bookname和booknum的值

(2)filter() 返回的是QuerySet对象,与all()相似,只是all()是查询所有数据,常用:filter表示‘ = ',exclude表示' != '。

(3)get()返回的是Model对象,类型为列表,说明使用get方法会直接执行sql语句获取数据。

来看一个QuerySet对象:

浅谈在django中使用filter()(即对QuerySet操作)时踩的坑

message = Message.objects.filter(pk=message_id2)
message[0].content

这样子确实可以读取到QuerySet中的数据,可是对QuerySet修改后的数据无法保存到数据库。

例1中不要尝试通过message.save()的方式去同步数据到数据库,因为QuerySet不存在save()方法。

正确写法如下:

要想同步到数据库中,需使用对象进行数据同步操作。

例2:

message = Message.objects.filter(pk=message_id2).first()
 
   message.id = message_id2
   message.content = content2
   message.message_type = message_type2
   message.save()

补充知识:Django filter和get的个人体会

开发环境:Ubuntu16.04+Django 1.11.9+Python2.7

filter返回的QuerySet:

filter返回的是QuerySet,可以切片以及遍历,get则不行.因为get只能获取唯一存在的数据,不存在或者存在多条都会报错.

在没有符合条件的值的时候:

get会报错

Book matching query does not exist.

filter则返回一个空列表,并不会报错.

<QuerySet []>`

继续往下执行代码

判断filter是否有值的时候:

book_info = Book.objects.filter(id=book_id, request_type=2)

queryset.exists()
if book_info.exists():

queryset.count==0:
if queryset.count>0:
  pass
else:
  pass
if queryset:
if queryset:
  pass
else:
  pass

filter也会有报错的情况:

filter字段类型为int的时候,输入的参数却是str的时候会报错:

invalid literal for int() with base 10: 'Yu'

使用get的时候,错误信息与上面filter一致.

filter字段存在,但是filter不到对应值的时候:

输出为:<QuerySet []>

为空的时候,自然也不能[0],取值.

使用filter作为过滤条件更新数据的时候:

Book.objects.filter(id=book_id, request_type=2).order_by("-time")[0].update(result=note)

会报错:

'Book' object has no attribute 'update'

使用filter不能部分更新,必须更新所有符合条件的.

但是可以使用[0]可以获取符合过滤条件的第一个值,

解决办法,使用save():

book_info = Book.objects.filter(id=book_id, request_type=2).order_by("-time")[0]
book_info.result = note
book_info.save()

filter 字段后常见的

这里是双下划线,__

__gt 大于
__gte 大于等于
__lt 小于
__lte 小于等于
__contains 包含
__icontains 包含 忽略大小写
__startswith 以...开头
__istartswith 以...开头 忽略大小写
__endswith 以...结尾
__iendswith 以...结尾,忽略大小写

以上这篇浅谈在django中使用filter()(即对QuerySet操作)时踩的坑就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python程序员鲜为人知但你应该知道的17个问题
Jun 04 Python
python集合类型用法分析
Apr 08 Python
Python 爬虫的工具列表大全
Jan 31 Python
centos6.4下python3.6.1安装教程
Jul 21 Python
python装饰器深入学习
Apr 06 Python
Django教程笔记之中间件middleware详解
Aug 01 Python
python爬虫之验证码篇3-滑动验证码识别技术
Apr 11 Python
Django Rest framework解析器和渲染器详解
Jul 25 Python
Python学习笔记之集合的概念和简单使用示例
Aug 22 Python
python读文件的步骤
Oct 08 Python
Python TCPServer 多线程多客户端通信的实现
Dec 31 Python
在Python中用GDAL实现矢量对栅格的切割实例
Mar 11 Python
Python sorted排序方法如何实现
Mar 31 #Python
解决Django中checkbox复选框的传值问题
Mar 31 #Python
Python文本文件的合并操作方法代码实例
Mar 31 #Python
Python调用接口合并Excel表代码实例
Mar 31 #Python
Python如何批量获取文件夹的大小并保存
Mar 31 #Python
Django使用list对单个或者多个字段求values值实例
Mar 31 #Python
django实现模板中的字符串文字和自动转义
Mar 31 #Python
You might like
PHP实现的博客欢迎提示功能(很特别哦)
2014/06/05 PHP
PHP扩展迁移为PHP7扩展兼容性问题记录
2016/02/15 PHP
PHP访问数据库集群的方法小结
2016/03/14 PHP
php简单统计中文个数的方法
2016/09/30 PHP
使用Microsoft Ajax Minifier减小JavaScript文件大小的方法
2010/04/01 Javascript
js动态添加onload、onresize、onscroll事件(另类方法)
2012/12/26 Javascript
JavaScript实现自己的DOM选择器原理及代码
2013/03/04 Javascript
JavaScript表达式:URL 协议介绍
2013/03/10 Javascript
用Move.js配合创建CSS3动画的入门指引
2015/07/22 Javascript
css如何让浮动元素水平居中
2015/08/07 Javascript
jquery动感漂浮导航菜单代码分享
2020/04/15 Javascript
jQuery实现简单的图片查看器
2020/09/11 Javascript
修改jquery中dialog的title属性方法(推荐)
2016/08/26 Javascript
jQuery Password Validation密码验证
2016/12/30 Javascript
JS动态插入脚本和插入引用外部链接脚本的方法
2018/05/21 Javascript
vue+element-ui实现表格编辑的三种实现方式
2018/10/31 Javascript
vscode配置vue下的es6规范自动格式化详解
2019/03/20 Javascript
教你30秒发布一个TypeScript包到NPM的方法步骤
2019/07/22 Javascript
python操作ssh实现服务器日志下载的方法
2015/06/03 Python
Python实现分割文件及合并文件的方法
2015/07/10 Python
浅谈python字典多键值及重复键值的使用
2016/11/04 Python
python 基础教程之Map使用方法
2017/01/17 Python
python实现将excel文件转化成CSV格式
2018/03/22 Python
python利用selenium进行浏览器爬虫
2019/04/25 Python
wxPython色环电阻计算器
2019/11/18 Python
python中如何使用insert函数
2020/01/09 Python
pyCharm 设置调试输出窗口中文显示方式(字符码转换)
2020/06/09 Python
Python如何使用ElementTree解析xml
2020/10/12 Python
django使用多个数据库的方法实例
2021/03/04 Python
编写html5时调试发现脚本php等网页js、css等失效
2013/12/31 HTML / CSS
微信小程序之html5 canvas绘图并保存到系统相册
2019/06/20 HTML / CSS
荷兰度假屋租赁网站:Aan Zee
2020/02/28 全球购物
2014年学校德育工作总结
2014/12/05 职场文书
青年志愿者服务活动总结
2015/05/06 职场文书
企业反腐倡廉心得体会
2015/08/15 职场文书
mysql拆分字符串作为查询条件的示例代码
2022/07/07 MySQL