天天看点

django orm级联_Python Day 60 Django框架、ORM高级查询、级联删除、增加多条数据、Django中Xss攻击、事务...

#高级查询#1. in 通过 字段名__in = [1,2] 查询

res = models.Student.objects.filter(age__in=[12,14,42]).all()#2. not in 通过exclude(字段名__in = [1,2]) exclude就是除了的意思

res = models.Student.objects.exclude(age__in=[12,14,42]).all()#3. like 通配查询

#where name like "李%" # 代表查询名字以李开头的所有

#name__istartswith 表示不区分大小写,以什么什么为开头

res = models.Student.objects.filter(name__startswith="李").all()#where name like "%白" # 表示匹配以白结尾的所有单词

#name__iendswith 表示不区分大小写,以什么什么为结尾

res = models.Student.objects.filter(name__endswith="白").all()#where name like "%小%" 表示匹配中间有 小 字的所有单词

#name__icontains 表示不区分大小写,包含什么什么的单词

res = models.Student.objects.filter(name__contains="小").all()#4. between .. and... 通过 列名__range = [开始位置,结束位置] 闭区间

res = models.Student.objects.filter(id__range=[2,5]).all()#5. limit 通过索引进行切片[10:20] 代表从10取到20 前闭后开

res = models.Student.objects.all()[5:7]#6. order by 通过order by 方法, 前面加"-"就是降序,默认升序

res = models.Student.objects.order_by("id").all()#可以多次排序 先按age字段降序,如果age相同,就按id字段升序

res = models.Student.objects.order_by("-age","id").all()#7. group by

#分组需要用到django中的方法

from django.db.models importCount, Max, Min, Sum

res= models.Student.objects.values("name").annotate(xxx=Count("id"))#表示的是搜索name字段和对表的id字段计算count,并起了别名为xxx 通过name字段进行分组,可使用# print(res.query)查看sql的语句

#SELECT "app01_student"."name", COUNT("app01_student"."id") AS "xxx" FROM "app01_student" GROUP BY "app01_student"."name"

#8. only 只取某列的值

res = models.Student.objects.only("name","age").all()#取出来是QuerySet 列表里面包含对象,对象中包含name字段的值以及id列的值

#和values取值的区别就是only取出来的是列表套对象,values取的是列表套字典

#并且,不管你only中是否包含id字段,他都会把你的id字段一并取出来

#9. defer 取出除了某列以外其他列的值

res = models.Student.objects.defer("id","name").all()#取出来的也是列表套对象,并且,不管你里面有没有id字段,都会把你id列的值取出来

#10. using

#我们在配置数据库时,会把数据库添加到DATABASES 中

#DATABASES = {

#'default': {

#'ENGINE': 'django.db.backends.sqlite3',

#'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),

#}

#}

#如果里面连有多个数据库,就可以通过using来确定使用哪一个数据库

res = models.Student.objects.all().using("default")#11. 查询表中一共有多少条数据

res =models.Student.objects.count()#12. 第一条数据

res =models.Student.objects.first()#13. 最后一条数据

res =models.Student.objects.last()#14. gt 大于 lt 小于 gte 大于等于 lte 小于等于

res = models.Student.objects.filter(id__gt=8).all()

res= models.Student.objects.filter(id__lte=8).all()#15. and 操作 , 在filter中用逗号隔开就是and

res = models.Student.objects.filter(id=2,age=23)#返回的还是QuerySet 类型

#16. or 操作

#or 需要从django中导入Q方法

from django.db.models importQ

res= models.Student.objects.filter(Q(id=2) | Q(age=12))

res= models.Student.objects.filter(Q(Q(id=2) | Q(age=12)) & Q(name="李铁柱"))#| 表示 或 & 表示 与

#17. 在原有的基础上更新,比如我想让某一列的值整体 + 1

#需要从django中导入F方法

Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取模的操作

from django.db.models importF

models.Student.objects.update(F("age") + 1)#这样age字段就会全部 + 1

#18. 原生sql语句

#django也给我们提供了写原生sql的方法

from django.db import connection #导入连接

cursor = connection.cursor() #生成cursor对象

cursor.execute() #可以提交sql语句,也可以传参数

cursor.fetchall() #拿取所有的结果

cursor.fetchone() #拿取一条结果

models.Student.objects.raw()#这个方法也可以提交sql语句,不建议使用

#注意:

1. orm能实现的功能, 尽量使用orm实现2. 不建议大家以后再自己的业务逻辑中, 混着用