浅谈在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之多进程和进程池(Processing库)
Jun 09 Python
Python机器学习之决策树算法实例详解
Dec 06 Python
Python断言assert的用法代码解析
Feb 03 Python
python3学习笔记之多进程分布式小例子
Feb 13 Python
python基于http下载视频或音频
Jun 20 Python
对PyTorch torch.stack的实例讲解
Jul 30 Python
pow在python中的含义及用法
Jul 11 Python
解决django后台管理界面添加中文内容乱码问题
Nov 15 Python
python 实现dict转json并保存文件
Dec 05 Python
python的Jenkins接口调用方式
May 12 Python
python实现简易版学生成绩管理系统
Jun 22 Python
如何利用python之wxpy模块玩转微信
Aug 17 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 远程关机操作的代码
2008/12/05 PHP
PHP句法规则详解 入门学习
2011/11/09 PHP
php天翼开放平台短信发送接口实现方法
2014/12/22 PHP
PHP实现简单ajax Loading加载功能示例
2016/12/28 PHP
PHP简单计算两个时间差的方法示例
2017/06/20 PHP
php魔法函数与魔法常量使用介绍
2017/07/23 PHP
PHP实现基于栈的后缀表达式求值功能
2017/11/10 PHP
PHP常用日期加减计算方法实例小结
2018/07/31 PHP
RGB颜色值转HTML十六进制(HEX)代码的JS函数
2009/04/25 Javascript
解析dom中的children对象数组元素firstChild,lastChild的使用
2013/07/10 Javascript
jquery 单引号和双引号的区别及使用注意
2013/07/31 Javascript
javascript创建createXmlHttpRequest对象示例代码
2014/02/10 Javascript
JavaScript 学习笔记之语句
2015/01/14 Javascript
学习JavaScript设计模式之代理模式
2016/01/12 Javascript
JS面向对象(3)之Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法
2016/02/25 Javascript
Bootstrap模仿起筷首页效果
2016/05/09 Javascript
gulp-htmlmin压缩html的gulp插件实例代码
2016/06/06 Javascript
Bootstrap实现水平排列的表单
2016/07/04 Javascript
HTML5 js实现拖拉上传文件功能
2020/11/20 Javascript
Bootstrap列表组学习使用
2017/02/09 Javascript
纯js仿淘宝京东商品放大镜功能
2017/03/02 Javascript
JS移动端/H5同时选择多张图片上传并使用canvas压缩图片
2017/06/20 Javascript
基于Two.js实现星球环绕动画效果的示例
2017/11/06 Javascript
JavaScript调用模式与this关键字绑定的关系
2018/04/21 Javascript
nodejs的安装使用与npm的介绍
2019/09/11 NodeJs
微信小程序工具函数封装
2019/10/28 Javascript
JavaScript Window窗口对象属性和使用方法
2020/01/19 Javascript
解决vue net :ERR_CONNECTION_REFUSED报错问题
2020/08/13 Javascript
Python中正则表达式详解
2017/05/17 Python
Python抓新型冠状病毒肺炎疫情数据并绘制全国疫情分布的代码实例
2020/02/05 Python
浅析Python面向对象编程
2020/07/10 Python
详解Html5中video标签那些属性和方法
2019/07/01 HTML / CSS
美国汽车性能部件和赛车零件网站:Vivid Racing
2018/03/27 全球购物
告诉你怎样写创业计划书
2014/01/27 职场文书
干部培训工作总结2015
2015/05/25 职场文书
暂住证明怎么写
2015/06/19 职场文书