https://blog.csdn.net/fm345689/article/details/80786284
本文以一个影视数据库为数据源
模型类:
作为演示sql,定义一个输出sql语句的方法
def showsql():
from django.db import connection
queries = connection.queries
print(queries[-1]['sql'])
方法演示(第一条为django语句,第二条为对应sql语言):
Movie.objects.get(mid=150) #查询一个,返回值:对象,查询不到出 .DoesNotExist 错。
SELECT `movie`.`mid`, `movie`.`mname`, `movie`.`mdesc`, `movie`.`mimg`, `movie`.`mlink` FROM `movie` WHERE `movie`.`mid` = 150
Movie.objects.first() #查询第一个,返回值:对象
SELECT `movie`.`mid`, `movie`.`mname`, `movie`.`mdesc`, `movie`.`mimg`, `movie`.`mlink` FROM `movie` ORDER BY `movie`.`mid` ASC LIMIT 1
Movie.objects.last() #查询最后一个,返回值:对象
SELECT `movie`.`mid`, `movie`.`mname`, `movie`.`mdesc`, `movie`.`mimg`, `movie`.`mlink` FROM `movie` ORDER BY `movie`.`mid` DESC LIMIT 1
Movie.objects.count() #查询总条数,返回值:int
SELECT COUNT(*) AS `__count` FROM `movie`
Movie.objects.all() #查询所有,但默认只取前21条,返回值:QuerySet ##懒加载
SELECT `movie`.`mid`, `movie`.`mname`, `movie`.`mdesc`, `movie`.`mimg`, `movie`.`mlink` FROM `movie` LIMIT 21
Movie.objects.all()[20:25] #查询20到25条(切片)
SELECT `movie`.`mid`, `movie`.`mname`, `movie`.`mdesc`, `movie`.`mimg`, `movie`.`mlink` FROM `movie` LIMIT 5 OFFSET 20
Movie.objects.filter(mname='王牌保镖') #条件查询,与get不同是的,它返回的是QuerySet集合,查找不到不报错
SELECT `movie`.`mid`, `movie`.`mname`, `movie`.`mdesc`, `movie`.`mimg`, `movie`.`mlink` FROM `movie` WHERE `movie`.`mname` = '王牌保镖' LIMIT 21
模糊查询(%、_、like):
Movie.objects.filter(mname__endswith='保镖') #以什么为结尾
SELECT `movie`.`mid`, `movie`.`mname`, `movie`.`mdesc`, `movie`.`mimg`, `movie`.`mlink` FROM `movie` WHERE `movie`.`mname` LIKE BINARY '%保镖' LIMIT 21
Movie.objects.filter(mname__startswith='保镖') #以什么开头
SELECT `movie`.`mid`, `movie`.`mname`, `movie`.`mdesc`, `movie`.`mimg`, `movie`.`mlink` FROM `movie` WHERE `movie`.`mname` LIKE BINARY '保镖%' LIMIT 21
Movie.objects.filter(mname__contains='保镖') #包含什么
SELECT `movie`.`mid`, `movie`.`mname`, `movie`.`mdesc`, `movie`.`mimg`, `movie`.`mlink` FROM `movie` WHERE `movie`.`mname` LIKE BINARY '%保镖%' LIMIT 21
Movie.objects.filter(mname__exact='保镖') #相等于什么
SELECT `movie`.`mid`, `movie`.`mname`, `movie`.`mdesc`, `movie`.`mimg`, `movie`.`mlink` FROM `movie` WHERE `movie`.`mname` = '保镖' LIMIT 21
Movie.objects.filter(mname__istartswith='m') #忽略大小写
SELECT `movie`.`mid`, `movie`.`mname`, `movie`.`mdesc`, `movie`.`mimg`, `movie`.`mlink` FROM `movie` WHERE `movie`.`mname` LIKE 'm%' LIMIT 21
Movie.objects.filter(mname__isnull=True) #判断该字段是否为空
SELECT `movie`.`mid`, `movie`.`mname`, `movie`.`mdesc`, `movie`.`mimg`, `movie`.`mlink` FROM `movie` WHERE `movie`.`mname` IS NULL LIMIT 21
Movie.objects.filter(mname__contains='保镖',mid=161) #多条件查询,后面逗号接语句
Movie.objects.filter(mname__contains='保镖').filter(mid=161) #功能与上面相同
SELECT `movie`.`mid`, `movie`.`mname`, `movie`.`mdesc`, `movie`.`mimg`, `movie`.`mlink` FROM `movie` WHERE (`movie`.`mid` = 161 AND `movie`.`mname` LIKE BINARY '%保镖%') LIMIT 21
Movie.objects.values('mname','mid').filter(mname__contains='保镖') #字段名部分显示
SELECT `movie`.`mname`, `movie`.`mid` FROM `movie` WHERE `movie`.`mname` LIKE BINARY '%保镖%' LIMIT 21
Movie.objects.filter(mname__contains='保镖').exclude(mname__startswith='爱情') #不等于什么
SELECT `movie`.`mid`, `movie`.`mname`, `movie`.`mdesc`, `movie`.`mimg`, `movie`.`mlink` FROM `movie` WHERE (`movie`.`mname` LIKE BINARY '%保镖%' AND NOT (`movie`.`mname` LIKE BINARY '爱情%')) LIMIT 21
Movie.objects.filter(mname__contains='保镖').order_by('mid') #排序,默认为升序, 在mid前加个"-"号则为降序,如:.order_by('-mid')
SELECT `movie`.`mid`, `movie`.`mname`, `movie`.`mdesc`, `movie`.`mimg`, `movie`.`mlink` FROM `movie` WHERE `movie`.`mname` LIKE BINARY '%保镖%' ORDER BY `movie`.`mid` ASC LIMIT 21
注意:
mname__contains、mname__istartswith
都是字段名加双下划线来查询。同也可以运用其它的方式来查询如:gt、lt、et等等,如
Movie.objects.filter(mid__gt=500).order_by('-mid') #查询mid大于等于500的数据
SELECT `movie`.`mid`, `movie`.`mname`, `movie`.`mdesc`, `movie`.`mimg`, `movie`.`mlink` FROM `movie` WHERE `movie`.`mid` > 500 ORDER BY `movie`.`mid` DESC LIMIT 21