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

作者:小耗lhx 时间:2022-05-03 10:24:49 

代码伺候:

先看如下代码:

例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 以...结尾,忽略大小写

来源:https://www.cnblogs.com/xiaohaodeboke/p/12583783.html

标签:django,filter,QuerySet
0
投稿

猜你喜欢

  • Python实现获取系统临时目录及临时文件的方法示例

    2022-03-11 00:42:04
  • 如何删除vue项目下的node_modules文件夹

    2023-07-02 17:10:00
  • 谦逊编程(翻译整理)

    2009-07-28 12:52:00
  • Python+Turtle动态绘制一棵树实例分享

    2021-10-03 00:33:20
  • Python 利用pydub库操作音频文件的方法

    2022-12-12 05:42:53
  • Python闭包的使用方法

    2022-11-27 07:45:07
  • javascript实现简单的二级联动

    2024-04-19 09:49:15
  • Python Pandas list列表数据列拆分成多行的方法实现

    2021-04-20 18:56:01
  • MSSQL监控数据库的DDL操作(创建,修改,删除存储过程,创建,修改,删除表等)

    2024-01-19 07:54:03
  • python打印文件的前几行或最后几行教程

    2022-04-30 01:14:09
  • python字符串下标与切片及使用方法

    2022-04-21 13:08:03
  • SQL server使用自定义函数以及游标

    2011-11-03 17:26:27
  • golang 中strings包的Replace的使用说明

    2024-02-09 16:02:04
  • PyCharm 光标变成黑块的解决方式

    2023-11-12 11:02:48
  • python爬虫教程之bs4解析和xpath解析详解

    2023-09-22 19:43:06
  • asp 实现检测字符串是否为纯字母和数字组合的函数

    2009-10-04 20:39:00
  • Python基于域相关实现图像增强的方法教程

    2023-08-24 15:30:22
  • jquery插件bootstrapValidator表单验证详解

    2024-04-22 22:22:05
  • Golang操作excel的方法

    2024-04-25 15:29:50
  • 经典mysql连接查询例题

    2024-01-14 17:32:29
  • asp之家 网络编程 m.aspxhome.com