Django企业开发实战-blog项目-QuerySet

本文详细介绍了Django中的QuerySet,包括其懒加载特性、常用接口如all, filter, exclude等,以及如何进行链式调用。讨论了get, create, count等非链式接口,并提到了exists()在判断数据存在性时的优势。此外,还涵盖了进阶接口defer, only, select_related和prefetch_related,以及各种字段查询方法。最后,文章提及了F表达式和Q表达式在复杂查询中的应用。" 52838696,5693317,Android 5.0 Camera预览数据流解析,"['Android开发', 'Camera', '图像处理']
摘要由CSDN通过智能技术生成

QuerySet

queryset本质上是一个懒加载,代码执行后不会进行数据库查询操作,只是会返回一个queryset对象,等你真正使用时才会执行查询

posts = post.objects.all()  # 返回一个questset对象并赋值给posts
available_posts = posts.filter(status=1)  # 继续返回一个queryset对象并赋值给available_posts
print(available_posts)  # 此时会根据上面的两个条件执行数据查询操作
# 对应的sql语句为:select * from blog_post where status=1;

链式调用:执行一个对象中的方法之后得到的结果还是这个对象,这样就可以直接执行对象上的其他方法,因为每个函数的返回值都是它自己(queryset)

常用的queryset接口
  1. 支持链式调用的接口 => 返回值是QuerySet的接口
    -all接口:相当于SELECT * FROM table_name
    -filter接口:根据条件过滤数据,常用的条件基本上是字段等于、不等于、大于、小于,以及类似LIKE查询的Model.objects.filter(content__contains='条件
    -exclude接口:同filter,只是相反的逻辑
    -reverse接口:把QuerySet中的结果倒序排序
    -distinct接口:用来进行去重查询,产生SELECT DISTINCT这样的查询
    -none接口:返回空的QuestSet

  1. 不接受链式调用的接口 => 返回值不是QuerySet的接口
    -get接口:如果存在,则直接返回对应的Post示例;如果不存在,则抛出DoesNotExist异常
    -create接口:用来创建一个Model对象
    -get_or_create接口:根据条件查找,如果没查找到,就调用create创建
    -count接口:用于返回QuestSet有多少条记录,相当于SELECT COUNT(*) FROM table_name
    -latest接口:用于返回最新的一条记录,但是需要在Model的Meta中定义:get_latest_by = <用来排序的字段>
    -earliest接口:同上,返回最早的一条记录
    -first接口:从当前QuerySet记录中获取第一条
    -last接口:同上,获取最后一条
    -exists接口:返回True或False,在数据库层面执行SELECT (1) AS 'a' FROM table_name LIMIT 1的查询,如果只是需要判断QuerySet是否有数据,用这个接口是最合适的方式。
    不要用count或者len(queryset)这样的操作来判断数据是否存在。相反,如果可以预期接下来会用到QuerySet中的数据,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值