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