浅谈在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自然语言编码转换模块codecs介绍
Apr 08 Python
Python 描述符(Descriptor)入门
Nov 20 Python
新手常见6种的python报错及解决方法
Mar 09 Python
将字典转换为DataFrame并进行频次统计的方法
Apr 08 Python
Jupyter notebook远程访问服务器的方法
May 24 Python
替换python字典中的key值方法
Jul 06 Python
python使用magic模块进行文件类型识别方法
Dec 08 Python
利用Python半自动化生成Nessus报告的方法
Mar 19 Python
python实现猜拳小游戏
Apr 05 Python
Django contrib auth authenticate函数源码解析
Nov 12 Python
pandas按照列的值排序(某一列或者多列)
Dec 13 Python
写好Python代码的几条重要技巧
May 21 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
杏林同学录(七)
2006/10/09 PHP
用PHP读取flv文件的播放时间长度
2009/09/03 PHP
twig模板获取全局变量的方法
2016/02/05 PHP
php生成复杂验证码(倾斜,正弦干扰线,黏贴,旋转)
2018/03/12 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
超简单的jquery的AJAX用法
2010/05/10 Javascript
jQuery Dialog 弹出层对话框插件
2010/08/09 Javascript
日常收集整理的JavaScript常用函数方法
2015/12/10 Javascript
javascript获取网页各种高宽及位置的方法总结
2016/07/27 Javascript
js对象浅拷贝和深拷贝详解
2016/09/05 Javascript
微信小程序动态显示项目倒计时效果
2017/06/13 Javascript
使用webpack搭建react开发环境的方法
2018/05/15 Javascript
Vue利用History记录上一页面的数据方法实例
2018/11/02 Javascript
重学JS 系列:聊聊继承(推荐)
2019/04/11 Javascript
说说如何利用 Node.js 代理解决跨域问题
2019/04/22 Javascript
微信小程序非跳转式组件授权登录的方法示例
2019/05/22 Javascript
element-ui tree结构实现增删改自定义功能代码
2020/08/31 Javascript
详解如何在Javascript中使用Object.freeze()
2020/10/18 Javascript
深入了解Vue动态组件和异步组件
2021/01/26 Vue.js
linux下安装easy_install的方法
2013/02/10 Python
Python tkinter事件高级用法实例
2018/01/31 Python
pytorch 指定gpu训练与多gpu并行训练示例
2019/12/31 Python
pytorch 实现查看网络中的参数
2020/01/06 Python
Python MySQLdb 执行sql语句时的参数传递方式
2020/03/04 Python
欧迪办公美国官网:Office Depot
2016/08/22 全球购物
Kiwi.com中国:找到特价机票并发现新目的地
2019/10/27 全球购物
俄罗斯金苹果网上化妆品和香水商店:Goldapple
2019/12/01 全球购物
澳大利亚购买健身器材网站:Gym Direct
2019/12/19 全球购物
J2EE系统只能是基于web
2015/09/08 面试题
如何写一份好的自荐信
2014/01/02 职场文书
护理专业毕业生自荐信
2014/06/15 职场文书
我心目中的好老师活动方案
2014/08/19 职场文书
2015年妇联工作总结范文
2015/04/22 职场文书
地道战观后感400字
2015/06/04 职场文书
大学生活感想
2015/08/10 职场文书
【js设计模式】SOLID五大设计原则
2022/03/24 Javascript