008 ORM之查询语句
目录
ORM 之 查询数据
1、queryset 数据类型
在python中一切皆对象,每一个变量是由不同数据类型生成,叫做类型对象,比如字典,就叫做字典对象,
django 的数据类型 QuerySet,也是一种数据类型,元素分别是模型对象和字典
模型对象类似于列表的数据对象,有索引,元素
字段的 key是字段名称 ,value是记录值
orm查询方法根据不同的调用方法返回的对象
一个是模型对象集合,一个是模型对象的本身,
针对sql的学习 主要是通过
join联表,where条件,group by 分组查询,having by 组内查询,order by 排序查询,limit 分页
orm在查询方面和sql的本质一致,把部分的需要通过复杂的查询语句封装到模型对象的方法了
比如 objects.first 升序查询第一个, last 降序查询第一个
1、全量查询 all
def select_student(request):
info = models.Student.objects.all()
# 获取表的所有的数据 返回值是queryset,元素是模型对象
print(info[0].name)
print(info[0].age)
print(info[0].sex)
return HttpResponse(info)
all()查询到的表数据,也叫做querySet对象,每一个元素是模型对象,每一个模型对象,是数据库的一条表记录。
2.all方法获取的queryset查询集,元素是模型对象。
2、first last 升序和降序第一个元素
def select_student(request):
info1 = models.Student.objects.all().first()
info2 = models.Student.objects.all().last()
print(info1.name)
print(info2.name)
return HttpResponse('123')
first查询第一个元素
last获取最后一个元素,返回值是模型对象
可以理解称 sql语法的返回唯一值相当于模型对象,
返回的多个值相当于查询集。
3、条件查询
3.filter 等于 where条件查询,与操作,也可以多个条件查询,返回结果是查询集
def select_student(request):
info1 = models.Student.objects.filter(age=22,sex=0)
print(info1)
return HttpResponse('123')
4、排除查询
exclude 排除操作,条件查询, 非操作,sql的not的含义,比如排除 id=3的条件的记录。 也可以多个条件,排除
def select_student(request):
info1 = models.Student.objects.exclude(age=22,sex=0)
# 排除多个条件值 返回的查询集
print(info1)
return HttpResponse('123')
5、主键查询 有且只有一个值
get 获取一个模型对象,有且只有一个的,必须唯一, 一般适用于主键查询
def select_student(request):
info1 = models.Student.objects.get(id=3)
print(info1)
return HttpResponse('123')
6、排序查询 order_by
def select_student(request):
info1 = models.Student.objects.all().order_by('age')
# 指定字段,默认是升序
info1 = models.Student.objects.all().order_by('-age')
# 字段前面加 - ,就是降序 也可以多个条件一起排序
info1 = models.Student.objects.all().order_by('-age','-id')
print(info1)
return HttpResponse('123')
就按照字段的属性进行排序,数字,字母表等
queryset 对象 调用 order_by 方法也就是排序语句
7、exist 判断表内有没有数据
def select_student(request):
info1 = models.Student.objects.exists()
print(info1)
有数据 Turn 无数据 false
return HttpResponse('123')
# SELECT (1) AS `a` FROM `db_student` LIMIT 1; 只取一条数据,不会有性能的问题
# exist直接判断表内有没有数据,性能好
8、计数器 count ,计算表记录的总数
def select_student(request):
info1 = models.Student.objects.all().count()
# 对返回的查询集进行统计元素的个数
print(info1)
return HttpResponse('123')
# count计数,返回查询的记录数。
9、字典元素 values 和valueslist
values('host','user')
查询表中的某一个或几个字段的返回值是字典集合,
queryset类型的元素有两种,一个是模型对象,sql中一整条记录中全部字段的的表达,
另一种类型是字典类型,sql中某个字段或几个字段的值和valueslist和values都是取字段的,
def select_student(request):
info1 = models.Student.objects.values_list('name','age')
print(info1)
return HttpResponse('123')
values 返回的是元素的字典元素
<QuerySet [{'name': '张三', 'age': 18}, {'name': '李四', 'age': 22}, {'name': '王五', 'age': 88},]>
valueslist 返回的是表记录的元组值
<QuerySet [('张三', 18), ('李四', 22), ('王五', 88), ('陈刘', 22)]>
def select_student(request):
info1 = models.Student.objects.values_list('name','age')
print(info1)
import json
print(list(info1))
info_list = list(info1)
print(json.dumps(info_list,ensure_ascii=False))
# 可以使用python 的list 函数强制 把 queryset转换成标准的列表类型。
# 然后在把列表转成json
queryset : <QuerySet [('张三', 18), ('李四', 22), ('王五', 88), ('陈刘', 22)]>
列表类型 : [('张三', 18), ('李四', 22), ('王五', 88), ('陈刘', 22)]
json类型: [["张三", 18], ["李四", 22], ["王五", 88], ["陈刘", 22]]
10 distinct 去重的功能
去除, distinct去除的作用,针对非主键字段的查询
def select_student(request):
info1 = models.Student.objects.values('age').distinct()
print(info1)
return HttpResponse('123')
# 去除单一字段的重复值
# 一般和统计一起使用
浙公网安备 33010602011771号