[TOC] >[success] # ORM 查询常见的字段 >[danger] ##### 支持链式调用的 ~~~ 1.all() --- 查询全部返回的是一个queryset类型 2.filter() --- 过滤查询指定内返回的是一个queryset类型 3.exclude() ---它包含不满足查询参数的对象返回的是一个queryset类型 4.reverse() ---方法反向排序QuerySet 中返回的元素 5.distinct() ---去重和values搭配使用 6.none() --- 调用none()将创建一个从不返回任何对象的查询集,并且在访问结果时不 会执行任何查询。 ~~~ >[danger] ##### 不支持链式调用的接口 ~~~ 1.get() --- 返回是一个对象,但不存在会报错注意处理,返回多个对象也会报错 2.create() --- 插入一条数据 3.get_or_create() --- 存在返回数据,不存在就创建数据 --- categories, is_creat = Categroy.objects.get_or_create(name="ss",owner_id=1) 返回两个参数,第一个参数是创建或者查询对象,第二个是是否创建,True就是创建成功打印结果‘Categroy object True’ 4.update_or_create() --- 更新创建数据 last 5.count() --- 查询条数 6.latest() ---Categroy.objects.latest('name') ---使用作为段提供的field_name,通过order by 返回降序第一个 ---'SELECT "blong_categroy"."id", "blong_categroy"."name", ' '"blong_categroy"."status", "blong_categroy"."is_nav", ' '"blong_categroy"."owner_id", "blong_categroy"."created_time" FROM ' '"blong_categroy" ORDER BY "blong_categroy"."name" DESC LIMIT 1', 7.earliest() ---同上返回升序第一个 'ASC' 8.first() --- 默认通过id 降序返回第一个,在Meta 里面设置ordering=('id','create_tiem') 指定字段排序 9.last() ---默认通过id 升序返回第一个 10.exists() ---用于搜寻对象是否在QuerySet 中以及QuerySet 是否存在任何对象 ---@override_settings(DEBUG=True) def test_filter(self): categories = Categroy.objects.filter(owner__username="wang").exists() print(categories) pp(connection.queries) --- 'SELECT (1) AS "a" FROM "blong_categroy" INNER JOIN "auth_user" ON ' '("blong_categroy"."owner_id" = "auth_user"."id") WHERE ' '"auth_user"."username" = \'wang\' LIMIT 1', --- 返回True 11.bulk_create() ---bulk_create()是执行一条SQL存入多条数据,里面是一个列表 执行的批量添加的sql ---用法 保存一组对象添加 user = User.objects.create_user("wang", "wang@qq", "wang1234") for i in range(1, 10): category_name = 'cate_%s' % i category = Categroy(name=category_name, owner=user) obj_list.append(category) --- 执行的sql 'INSERT INTO "blong_categroy" ("name", "status", "is_nav", ' '"owner_id", "created_time") SELECT \'cate_1\', 1, 0, 1, \'2018-06-09 ' "04:51:33.025432' UNION ALL SELECT 'cate_2', 1, 0, 1, '2018-06-09 " "04:51:33.025432' UNION ALL SELECT 'cate_3', 1, 0, 1, '2018-06-09 " "04:51:33.025432' UNION ALL SELECT 'cate_4', 1, 0, 1, '2018-06-09 " "04:51:33.025432' UNION ALL SELECT 'cate_5', 1, 0, 1, '2018-06-09 " "04:51:33.025432' UNION ALL SELECT 'cate_6', 1, 0, 1, '2018-06-09 " "04:51:33.025432' UNION ALL SELECT 'cate_7', 1, 0, 1, '2018-06-09 " "04:51:33.025432' UNION ALL SELECT 'cate_8', 1, 0, 1, '2018-06-09 " "04:51:33.025432' UNION ALL SELECT 'cate_9', 1, 0, 1, '2018-06-09 " "04:51:33.025432'", 12.in_bulk() ---获取主键值的列表,并返回将每个主键值映射到具有给定ID的对象的实例的 字典。 如果未提供列表,则会返回查询集中的所有对象。 >>> Blog.objects.in_bulk([1]) {1: <Blog: Beatles Blog>} >>> Blog.objects.in_bulk([1, 2]) {1: <Blog: Beatles Blog>, 2: <Blog: Cheddar Talk>} >>> Blog.objects.in_bulk([]) {} >>> Blog.objects.in_bulk() {1: <Blog: Beatles Blog>, 2: <Blog: Cheddar Talk>, 3: <Blog: Django Weblog>} 13.update() ---更新数据,只支持queryset 类型,也就是说支持链式调用的参数进行使用 14.delete() ---删除数据 ~~~ >[danger] ##### 进阶接口--具体见ORM技巧篇 ~~~ 1.defer() ----除了什么字段以外 2.only() ----只查询什么字段 3.select_related() ----两个表关联的时候,差另一个表的信息 join on 用法 4.prefetch_related() ~~~ * 注 官方注解对select_related()解释 ~~~ Returns a new QuerySet instance that will select related objects. If fields are specified, they must be ForeignKey fields and only those related objects are included in the selection. If select_related(None) is called, the list is cleared. ~~~ * 简单的说无参就是默认,查ForeignKey,有差数是你去指定关联的ForeignKey ~~~ 返回一个新的QuerySet实例,它将选择相关的对象。 如果字段被指定,它们必须是外键字段,只有那些字段 相关的对象包含在选择中。 如果调用selectrelated(None),则清除列表。 ~~~ >[danger] ##### F/Q具体见ORM技巧/常见问题篇 * F专门取对象中某列值的操作,也可以做并发处理 ~~~ from django.db.models import F models.Tb1.objects.update(num=F('num')+1) ~~~ * Q 条件查询 ~~~ from django.db.models import Q categories = Categroy.objects.filter(Q(id=1) | Q(id=2)) ---- 打印的语句 'SELECT "blong_categroy"."id", "blong_categroy"."name", ' '"blong_categroy"."status", "blong_categroy"."is_nav", ' '"blong_categroy"."owner_id", "blong_categroy"."created_time" FROM ' '"blong_categroy" WHERE ("blong_categroy"."id" = 1 OR ' '"blong_categroy"."id" = 2) LIMIT 21' ~~~