模型层:models之各种查询、分组查询、聚合查询、F和Q查询
如何只单独测试django中的某一个py文件?如何书写测试脚本?
在任意一个py文件中书写以下代码
应用下的tests或者自己新建一个
import os
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "项目名.settings")
import django
django.setup()
一、django orm 单表查询
必会16条
1、create() 增 返回值是 当前被创建数据的对象本身
2、all() 查所有 返回值是 QuerySet对象
3、filler() 不写条件表示查所有。可以写一个或多个条件,表示and关系。当查询条件不存在时会返回空的对象queryset[ ]
返回值是 QuerySet对象
补充:只要是queryset对象,就可以通过 点query 的方式获取到当前对象内部的sql语句
4、get() 直接获取本身对象。但是当查询条件不存在时会直接报错。(不推荐使用)
5、values() 返回的是QuerySet对象
6、values_list() 返回的是QuerySet对象
7、first() 返回的是 对象本身。(表示取QuerySet对象中的 第一个元素对象)
8、last() 返回的是 对象本身。(表示取QuerySet对象中的 最后一个元素对象)
9、update() 返回值是受影响的行数
10、delete() 返回值是受影响的行数和删除的来源
11、count() 返回值是统计数据的条数
12、order_by() 返回的是QuerySet对象。表示的是按照指定字段排序
13、exclude() 返回的是QuerySet对象。表示的是排除什么之外
14、exists() 返回的是布尔值。表示判断当前的对象是否有数据
15、reverse() 表示的是把QuerySet对象按照倒序排。表示反转
16、distinct() 表示把QuerySet对象中重复的数据对象去除掉。
注意:使用去重时,要把id排除在外
双下划线查询
1、__gt (字段__gt=数字) 表示 大于什么什么。返回的是QuerySet对象
2、__lt (字段__lt=数字) 表示 小于什么什么。返回的是QuerySet对象
3、__gte (字段__gte=数字) 表示 大于等于什么什么。返回的是QuerySet对象
补充:精确度问题。django的精确度低,不敏感
4、__lte (字段__lte=数字) 表示 小于等于什么什么。返回的是QuerySet对象
5、__in=[ ] (字段__in=[ ]) 表示 按照条件查询。返回的是QuerySet对象
6、__range=() (字段__range=可迭代对象) 表示 按照什么什么区间,顾头也顾尾。返回的是QuerySet对象
7、__contains=' 某某 ' (字段__contains='某某') 表示 按照某某条件查。返回的是QuerySet对象
8、__year=2014 按年份查
9、__month=1 按月份查
二、多表查询
1、外键字段的增删改查
01、一对多 的外键字段的操作
001、增:create()
方法一、直接增写实际表的字段
方法二、先拿到关联表的字段对象,再去写实际表的字段
002、查:看必会16条
003、改:update()
方法一、直接改写实际表的字段
方法二、先拿到关联表的字段对象,再去改写实际表的字段
004、删:delete()
注意:外籍字段在1.X版本中默认的是级联更新、级联删除。2.X版本中,则需要自己手动指定
2、多对多 的外键字段的操作
01、给书籍绑定作者关系 用add() 括号内可以传多个参数
方法一、直接给书籍绑定作者
方法二、先获取作者对象,再给书籍对象绑定作者对象
02、移除书籍与作者绑定的关系 用remove() 括号内可以传多个参数
方法一、直接在书籍对象中移除
方法二、先获取要移除的作者对象,再在书籍对象中移除作者对象
03、修改书籍与作者的关系 用set() 括号内可以传多个参数
方法一、直接在书籍对象中修改
注意:set()的括号内要是可迭代对象
方法二、先获取要修改的作者对象,再在书籍对象中移修改作者对象
04、清空书籍与作者的关系 用clear()
三、跨表查询
1、基于对象的跨表查询(其实就是子查询)
正向反向的区分:要看外键字段在哪。
01、正向查询:外键字段在当前数据对象中
001、
002、
补充
003、
02、反向查询:外键字段不在当前数据对象中
表名小写是否需要加_set.all() 一对多或多对多时的反向时需要。一对一关系时的反向不需要
004、
005、
006、
2、基于双下划线的跨表查询(其实就是链表查询)
只要表之间有关系,可以通过正向的外键字段或者反向的表名小写进行链表查询
01、
02、
03、
04、
05、
三、聚合查询:关键字:aggregate
01、
02、
03、
四、分组查询:关键字:annotate
01、
02、
03、
04、
05、
五、F和Q查询
1、F查询:表示获取到表中某个字段对应的值
01、
02、
2、Q查询:表示能够改变查询的条件关系 and(,) or(|) not(~) 与 或 非
01、 from django.db.models import Q
补充:
02、Q的高级用法:q=Q() 表示获取q对象。q.connector='or' 或者 'and' 表示修改关系为 '或' 或者 '与’ 。q.children.append(('price',1000)) 表示添加条件
应用场景:当写的业务逻辑有组合查询时