看专业的官网文档,做专业的程序员!

必知必会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、数据表添加内容如下

ORM表相关操作

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:  李四>>]>
orm.py

相关文章: