模型层: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))   表示添加条件

              应用场景:当写的业务逻辑有组合查询时

posted @ 2020-01-08 12:13  薛定谔的猫66  阅读(1126)  评论(1)    收藏  举报