共计 1549 个字符,预计需要花费 4 分钟才能阅读完成。
一、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
正文完
星哥玩云-微信公众号