必知必会13条
<1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。 <4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象 <5> values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列 <6> values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列 <7> order_by(*field): 对查询结果排序 <8> reverse(): 对查询结果反向排序,请注意reverse()通常只能在具有已定义顺序的QuerySet上调用(在model类的Meta中指定ordering或调用order_by()方法)。 <9> distinct(): 从返回结果中剔除重复纪录(如果你查询跨越多个表,可能在计算QuerySet时得到重复的结果。此时可以使用distinct(),注意只有在PostgreSQL中支持按字段去重。) <10> count(): 返回数据库中匹配查询(QuerySet)的对象数量。 <11> first(): 返回第一条记录 <12> last(): 返回最后一条记录 <13> exists(): 如果QuerySet包含数据,就返回True,否则返回False
返回QuerySet对象的方法有
all()
filter()
exclude()
order_by()
reverse()
distinct()
特殊的QuerySet
values() 返回一个可迭代的字典序列
values_list() 返回一个可迭代的元祖序列
返回具体对象的
get()
first()
last()
返回布尔值的方法有:
exists()
返回数字的方法有
count()
单表查询之神奇的双下划线
# 大于,小于 # # models.Tb1.objects.filter(id__gt=1) # 获取id大于1的值 # models.Tb1.objects.filter(id__gte=1) # 获取id大于等于1的值 # models.Tb1.objects.filter(id__lt=10) # 获取id小于10的值 # models.Tb1.objects.filter(id__lte=10) # 获取id小于10的值 # models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值 # in # # models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据 # models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in # contains # models.Tb1.objects.filter(name__contains="ven") # 获取name字段包含"ven"的 # models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感 # range # models.Tb1.objects.filter(id__range=[1, 3]) # id范围是1到3的,等价于SQL的bettwen and 类似的还有:startswith,istartswith, endswith, iendswith # date字段还可以: # models.Class.objects.filter(first_day__year=2017)
单表查询练习
1、创建数据库
create database orm;
2、models文件
from django.db import models class Person(models.Model): name = models.CharField(max_length=32) age = models.IntegerField() birthday = models.DateField()
3、数据表添加内容如下
4、项目目录下面的orm练习文件
import os if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day8_15ORM.settings") import django django.setup() from app01 import models # all 查询所有人 ret = models.Person.objects.all() print(ret) #// <QuerySet [<Person: <Person-Object: 张三>>, <Person: <Person-Object: 李四>>, <Person: <Person-Object: 王五>>, <Person: <Person-Object: 小黑>>, <Person: <Person-Object: 小白>>, <Person: <Person-Object: 小黄>>]> # get 指定查询 ret = models.Person.objects.get(id=2) print(ret) #// <Person-Object: 李四> # filter # 就算查询的结果只有一个,返回的也是QuerySet,我们要用索引的方式取出第一个元素 ret = models.Person.objects.filter(id=2) print(ret) #// <QuerySet [<Person: <Person-Object: 李四>>]> # 如果要取指定的元素,需要通过索引 ret = models.Person.objects.filter(id=2)[0] print(ret) #// <Person-Object: 李四> # 不存在返回一个空的QuerySet,不会报错 ret = models.Person.objects.filter(id=20) print(ret) #// <QuerySet []> # exclude # 查询除了id值为1的所有人 ret = models.Person.objects.exclude(id=1) print(ret) #// <QuerySet [<Person: <Person-Object: 李四>>, <Person: <Person-Object: 王五>>, <Person: <Person-Object: 小黑>>, <Person: <Person-Object: 小白>>, <Person: <Person-Object: 小黄>>]> # values # 根据指定字段查询, 返回的是一个QuerySet对象,里面都是字典。 ret = models.Person.objects.values("name") print(ret) #// <QuerySet [{'name': '张三'}, {'name': '李四'}, {'name': '王五'}, {'name': '小黑'}, {'name': '小白'}, {'name': '小黄'}]> # 如果不写value, 默认查询所有 ret = models.Person.objects.values() print(ret) #// <QuerySet [{'id': 1, 'name': '张三', 'age': 10, 'birthday': datetime.date(2008, 8, 5)}, {'id': 2, 'name': '李四', 'age': 20, 'birthday': datetime.date(1998, 6, 2)}, {'id': 3, 'name': '王五', 'age': 30, 'birthday': datetime.date(1988, 3, 2)}, {'id': 4, 'name': '小黑', 'age': 40, 'birthday': datetime.date(1978, 11, 14)}, {'id': 5, 'name': '小白', 'age': 12, 'birthday': datetime.date(2006, 2, 7)}, {'id': 6, 'name': '小黄', 'age': 50, 'birthday': datetime.date(1968, 5, 20)}]> # values_list # 通values一样,只是返回的里面是元组 ret = models.Person.objects.values_list("name") print(ret) #// <QuerySet [('张三',), ('李四',), ('王五',), ('小黑',), ('小白',), ('小黄',)]> # 如果不写value, 默认查询所有 ret = models.Person.objects.values_list() print(ret) #// <QuerySet [(1, '张三', 10, datetime.date(2008, 8, 5)), (2, '李四', 20, datetime.date(1998, 6, 2)), (3, '王五', 30, datetime.date(1988, 3, 2)), (4, '小黑', 40, datetime.date(1978, 11, 14)), (5, '小白', 12, datetime.date(2006, 2, 7)), (6, '小黄', 50, datetime.date(1968, 5, 20))]> # order_by 对查询结果按照指定字段排序, 根据年龄排序 ret = models.Person.objects.all().order_by("age") print(ret) #// <QuerySet [<Person: <Person-Object: 张三>>, <Person: <Person-Object: 小白>>, <Person: <Person-Object: 李四>>, <Person: <Person-Object: 王五>>, <Person: <Person-Object: 小黑>>, <Person: <Person-Object: 小黄>>]> # reverse 根据年龄排序,再进行反转 ret = models.Person.objects.all().order_by("age").reverse() print(ret) #// <QuerySet [<Person: <Person-Object: 小黄>>, <Person: <Person-Object: 小黑>>, <Person: <Person-Object: 王五>>, <Person: <Person-Object: 李四>>, <Person: <Person-Object: 小白>>, <Person: <Person-Object: 张三>>]> # count 统计匹配查询的对象数量 ret = models.Person.objects.all().count() print(ret) #// 6 # first 查询第一条记录 ret = models.Person.objects.first() print(ret) #// <Person-Object: 张三> # last 查询最后一条记录 ret = models.Person.objects.last() print(ret) #// <Person-Object: 小黄> # exists 判断表中是否有数据 ret = models.Person.objects.exists() print(ret) #// True 单表查询之神奇的双下划綫 # 查询id值大于1小于4的结果 ret = models.Person.objects.filter(id__gt=1, id__lt=4) print(ret) #// <QuerySet [<Person: <Person-Object: 李四>>, <Person: <Person-Object: 王五>>]> # in 查询id值在 [1, 3, 5, 7]中的结果 ret = models.Person.objects.filter(id__in=[1, 3, 5, 7]) print(ret) #// <QuerySet [<Person: <Person-Object: 张三>>, <Person: <Person-Object: 王五>>, <Person: <Person-Object: 小白>>]> # not in ret = models.Person.objects.exclude(id__in=[1, 3, 5, 7]) print(ret) #// <QuerySet [<Person: <Person-Object: 李四>>, <Person: <Person-Object: 小黑>>, <Person: <Person-Object: 小黄>>]> # contains 查询name字段包含三的 ret = models.Person.objects.filter(name__contains="三") print(ret) #// <QuerySet [<Person: <Person-Object: 张三>>]> # range 查询id范围在1到3之间的 ret = models.Person.objects.filter(id__range=[1,3]) print(ret) #// <QuerySet [<Person: <Person-Object: 张三>>, <Person: <Person-Object: 李四>>, <Person: <Person-Object: 王五>>]> # 日期和时间字段还可以有以下写法 ret = models.Person.objects.filter(birthday__year=2008) print(ret) #// <QuerySet [<Person: <Person-Object: 张三>>]> # 根据月查询 ret = models.Person.objects.filter(birthday__month=6) print(ret) #// <QuerySet [<Person: <Person-Object: 李四>>]>