models还是之前的学生Student4、班级Clazz1
Q查询-增强版与或非
多条件
之前讲过多条件筛选,用逗号,也可以用双过滤器.filter .filter
但是只能进行与的操作
Movie.objects.filter(mname__icontains='H',mid=7497)
Movie.objects.filter(mname__icontains='H').filter(mid=7497)
Q的与或非
Q查询是多条件的增强版,可以表示&与,|或,~非
以及多个的组合,比如非与
showsql还是上次那个封装查看sql的方法
from stu.models import *
from django.db.models import Q,F
Student4.objects.filter(Q(sname='lisi')&Q(score=99))
def showsql():
from django.db import connection
print(connection.queries[-1]['sql'])
showsql()
Student4.objects.filter(sname='lisi',score=99)
Student4.objects.filter(Q(sname='lisi')|Q(score=99))
Student4.objects.filter(~Q(sname='wangwu'))
Student4.objects.filter(~Q(sname='zhangsan',score=88))
F查询-选择原数据一列
如果要把id=3的score+10分
原生sql语句:
update stu_student4 set score=score+10 where id=3
之前学过django更新有两种方式,save全部更新效率慢,所以用update
Student4.objects.filter(id=3).update(score=F('score')+10)
返回值是1,可以查表格,的确增加了10
这里F查询的功能,就是用来选择更新之前表格的一列数据,即sql里的第二个score:
score=score+10
注意筛选用filter,返回Queryset不会报错
之前讲过不要用get,它返回的是对象,没有update属性
Q的范围更新
如果要把学号大于3的成绩都加10分,需要加上范围
大于gt、大于等于gte、小于lt
范围值用于update的时候,需要在前面加上Q
Student4.objects.filter(Q(id__gt=3)).update(score=F('score')+10)
返回2,表示两个数据受到影响了