高级数据查询
阅读 (243404)
分享
一、Q对象
-
导入
from django.db.models import Q
-
逻辑或
作为or查询来使用
def q(req): u = User.objects.filter(Q(age__gt=20)) #这个没有and和or一说 因为就一个条件 u = User.objects.filter(Q(age__gt=20)|Q(sex=True)) #查询age大于20 或 性别为True的 return render(req,'show.html',{'data':u})
-
逻辑非
def q(req): # 查询年龄不为20的数据 u = User.objects.filter(~Q(age=20)) u = User.objects.exclude(age=20) return render(req,'show.html',{'data':u})
二、F对象
-
导入
from django.db.models import F
-
作用
可以使用模型的字段A与字段B进行比较,如果字段A写在了等号左侧,则字段B只能出现在等号右侧,需要通过F类进行构造
-
需求
获取男生个数多于女生个数的班级
-
示例
def f(req): gs = Grade.objects.filter(gboynum=F("ggirlnum")) print(gs) return HttpResponse('f')
-
F对象支持数学操作
gs = Grade.objects.filter(gboynum=F("ggirlnum")+35)
-
可以使用“关联模型类名小写__属性名”进行关联查询
-
需求
获取所有班级中学生所在的班级信息
-
示例
gs = Grade.objects.filter(isDelete=F("student__isDelete")) print(gs)
-
三、关联查询
-
作用
处理join
-
语法
关联模型类名小写
__属性名__
比较运算符=值 -
需求
获取描述中包含lucky的学生所在班级
-
示例
gs = Grade.objects.filter(student__sname__contains="lucky") print(gs)
四、原生sql操作
-
格式
类名.objects.raw(‘SQL语句’)
-
示例
查询所有字段
def index(req): obj = User.objects.raw('select * from user') for i in obj: print(i.username,i.sex) return HttpResponse('index')
查询个别字段
def index(req): obj = User.objects.raw('select id,username,sex from user') for i in obj: print(i.username,i.sex) return HttpResponse('index')
注意:当查询为某几个字段的时候 则必须包含主键字段 否则报错
raise InvalidQuery('Raw query must include the primary key')
-
别名查询
格式:类名.objects.raw(‘SQL语句’)
User.objects.raw('''select username as name, age as uage, id FROM user''')
您可以使用
translations
参数to 将查询中的字段映射到模型字段raw()
。这是一个字典,将查询中字段的名称映射到模型上字段的名称上面的查询也可以写成
field_map = {'username': 'name', 'age': 'uage'} u = User.objects.raw('SELECT * FROM user', translations=field_map)
五、获取原生SQL语句
-
说明
将返回查询集的过滤器转换成原生SQL
-
属性
query
-
实例
User.objects.all().query
需要
登录
才可以提问哦
: