浅谈在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网络编程学习笔记(五):socket的一些补充
Jun 09 Python
python 按照固定长度分割字符串的方法小结
Apr 30 Python
Centos下实现安装Python3.6和Python2共存
Aug 15 Python
django2.0扩展用户字段示例
Feb 13 Python
解决pycharm 工具栏Tool中找不到Run manager.py Task的问题
Jul 01 Python
Python 等分切分数据及规则命名的实例代码
Aug 16 Python
pycharm显示远程图片的实现
Nov 04 Python
Python连接Hadoop数据中遇到的各种坑(汇总)
Apr 14 Python
浅析python中的del用法
Sep 02 Python
使用Python+Appuim 清理微信的方法
Jan 26 Python
Python爬虫之爬取哔哩哔哩热门视频排行榜
Apr 28 Python
Python 发送SMTP邮件的简单教程
Jun 24 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 ? EasyUI DataGrid 资料取的方式介绍
2012/11/07 PHP
PHP 实现explort() 功能的详解
2013/06/20 PHP
PHP伪静态Rewrite设置之APACHE篇
2014/07/30 PHP
ThinkPHP框架实现数据增删改
2017/05/07 PHP
JavaScript 常用函数库详解
2009/10/21 Javascript
文本框根据输入内容自适应高度的代码
2011/10/24 Javascript
jquery实现商品拖动选择效果代码(自写)
2013/05/28 Javascript
jQuery下的动画处理总结
2013/10/10 Javascript
js 日期比较相关天数代码
2014/04/02 Javascript
我用的一些Node.js开发工具、开发包、框架等总结
2014/09/25 Javascript
Bootstrap3学习笔记(三)之表格
2016/05/20 Javascript
利用HTML5+Socket.io实现摇一摇控制PC端歌曲切换
2017/01/13 Javascript
JavaScript通过改变文字透明度实现的文字闪烁效果实例
2017/04/27 Javascript
浅析 NodeJs 的几种文件路径
2017/06/07 NodeJs
在Js页面通过POST传递参数跳转到新页面详解
2017/08/25 Javascript
在vue里使用codemirror遇到的问题
2018/11/01 Javascript
微信小程序仿知乎实现评论留言功能
2018/11/28 Javascript
原生JS实现的自动轮播图功能详解
2018/12/28 Javascript
[38:27]完美世界DOTA2联赛PWL S2 Forest vs FTD.C 第二场 11.26
2020/11/30 DOTA
Python 元组(Tuple)操作详解
2014/03/11 Python
linux 下实现python多版本安装实践
2014/11/18 Python
PyQt5每天必学之事件与信号
2018/04/20 Python
Python3爬虫学习之将爬取的信息保存到本地的方法详解
2018/12/12 Python
Django使用uwsgi部署时的配置以及django日志文件的处理方法
2019/08/30 Python
Python3中的f-Strings增强版字符串格式化方法
2020/03/04 Python
解决使用python print打印函数返回值多一个None的问题
2020/04/09 Python
python绘制高斯曲线
2021/02/19 Python
HTML5 input placeholder 颜色修改示例
2014/05/30 HTML / CSS
LG西班牙网上商店:Tienda LG Online Es
2019/07/30 全球购物
C++如何引用一个已经定义过的全局变量
2014/08/25 面试题
如何提高SQL Server的安全性
2016/07/25 面试题
初级软件工程师面试题 Junior Software Engineer Interview
2015/02/15 面试题
《珍珠泉》教学反思
2014/02/20 职场文书
小学生母亲节演讲稿
2014/05/07 职场文书
用Python写一个简易版弹球游戏
2021/04/13 Python
SQL实现LeetCode(197.上升温度)
2021/08/07 MySQL