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