• Django学习4


    ORM单表操作

    类 --- 表
    类对象 --- 一行数据
    类属性 --- 字段
    

    #创建记录方式一
    student_obj = models.Student(
        name='大壮',
        age=48,
    )
    student_obj.save()
    
    #创建记录方式二
    models.Student.objects 对象控制器
    new_obj = models.Student.objects.create(name='雪飞',age=18)	#也可写成**{'name':'雪飞','age':18}
    print(new_obj)        # Student object -- model对象  .属性可以获取对应字段的数据
    print(new_obj.name)  # 雪飞
    print(new_obj.age)  # 18
    
    #创建记录方式三 -- 批量创建1
    objs = []
    for i in range(20):
        obj = models.Student(
            name='玉溪%s'%i,
            age=10+i,
        )
        objs.append(obj)
    models.Student.objects.bulk_create(objs)
    
    #创建记录方式四 -- 有则更新无则添加 update_or_create
    models.Student.objects.update_or_create(
        name = '双喜',
        defaults={
            'age':26
        }
    )
    
    # 添加日期数据
    # 方式一 datetime.datetime对象
    import datetime
    current_date = datetime.datetime.now()
    models.Birthday.objects.create(name='小智',date=current_date)
    # 方式二 字符串
    models.Birthday.objects.create(name='路比',date='2000-6-18')
    

    #删除 delete
    models.Student.objects.get(id=1).delete()   # 用model对象调用delete方法(get方法返回的是model对象)
    models.Student.objects.filter(name='阿强').delete()   # 用queryset对象也可调用delete方法
    models.Student.objects.all().delete()   # 删除所有数据
    

    #更新
    models.Student.objects.get(name='阿强').update(age=30)    # model对象没有更新方法 报错信息:'Student' object has no attribute 'update'
    models.Student.objects.filter(name='阿强').update(age=30)   # 只能queryset对象调用
    

    查 (简单)

    简单查询(三剑客 all filter get)
    1.查询所有的数据  .all方法  返回的是QuerySet集合
    all_objs = models.Student.objects.all()
    # print(all_objs)   # <QuerySet [<Student: Student object>, <Student: Student object>, <Student: Student object>]> -- 类似于列表 -- queryset集合
    # for i in all_objs:
    #     print(i.name)   # 小智 小霞 小刚
    
        print(all_objs)  # < QuerySet[ < Student: 小智 >, < Student: 小霞 >, < Student: 小刚 >] >(改写了__str__)
    
    2.条件查询  .filter方法  返回的是QuerySet集合,查询不到内容不会报错,返回<QuerySet []>
    objs = models.Student.objects.filter(id=3)  # 找id为3的记录
    print(objs)     # <QuerySet [<Student: 小刚>]>
    
    3.条件查询  .get方法  返回的是model对象!而且get方法有且必须只有一个结果,否则报错(为空或者多了)!
    objs = models.Student.objects.get(id=3)  # 找id为3的记录
    print(objs)     # 小刚
    

    查询接口

    <1> all():                  查询所有结果,结果是queryset类型
    
    <2> filter(**kwargs):	   查询与所给筛选条件相匹配的对象,结果是queryset类型
        #多条件
        models.Student.objects.filter(id=7,name='吴尊').update(name='无极尊',age=27,)
        #打散形式传参
        models.Student.objects.filter(**{'id':7,'name':'无极尊'}).update(age=100,)
        #queryset类型可以调用filter再过滤
        models.Student.objects.all().filter(id=7)
    
    <3> get(**kwargs):          返回与所给筛选条件相匹配的对象,model对象,返回结果有且只有一个,否则报错
        
    <4> exclude(**kwargs):	   排除符合条件的对象  object控制器和queryset集合都可以调用,返回结果是queryset类型
        object控制器调用:
        query = models.Student.objects.exclude(id=3)
        QuerySet对象调用:
        query = models.Student.objects.filter(age=26).exclude(id=24)
    
    <5> order_by(*field):    	queryset类型的数据来调用,对查询结果排序,返回值还是queryset类型
        query = models.Student.objects.all().order_by('age','-id')  # 按age升序排,age相同的时候按id降序排
      
    <6> reverse():              queryset类型的数据来调用,在排序的结果基础上反向排序,返回值还是queryset类型
        query = models.Student.objects.all().order_by('id').reverse()
        
    <7> count():			   	queryset类型的数据来调用,返回数据库中匹配查询(QuerySet)的对象数量(数字)。
        num = models.Student.objects.all().count()
        
    <8> first(): 			   	queryset类型的数据来调用,返回第一条记录,结果为model对象
    <9> last():					queryset类型的数据来调用,返回最后一条记录,结果为model对象
       
    <10> exists():				queryset类型的数据来调用,如果QuerySet包含数据,就返回True,否则返回False
        obj = models.Student.objects.all().filter(name='无极尊').exists()
        if obj:print(obj)
        else:print('nothing...')
        
    <11> values(*field):		返回里面是字典的queryset类型(一个字典就是一行数据,字典的键就是字段)
        query = models.Student.objects.filter(age=26).values()
        print(query)    # <QuerySet [{'id': 24, 'name': '相玺16', 'age': 26}, {'id': 28, 'name': '文洋', 'age': 26}]>
        # values可以指定字段
        query = models.Student.objects.filter(age=26).values('name','age')
        
    <12> values_list(*field): 	返回里面是元组的queryset类型(一个元组就是一行数据,元组里面的每一项对应一个字段)
        query = models.Student.objects.filter(age=26).values_list()
        print(query)    # <QuerySet [(24, '相玺16', 26), (28, '文洋', 26)]>
        # values_list也可以指定字段
        query = models.Student.objects.filter(age=26).values_list('name','age')
        
    <13> distinct(): 		values和values_list得到的queryset类型的数据来调用,从返回结果中剔除重复纪录,返回结果还是queryset类型
        models.Student.objects.all().values('age').distinct()
        
    

    基于双下划线的模糊查询

    # __ 找id>7的
    query = models.Student.objects.filter(id__gt=7)
    # __ 找id>=7的
    query = models.Student.objects.filter(id__gte=7)
    # 找id<7的
    query = models.Student.objects.filter(id__lt=7)
    # 找id<=7的
    query = models.Student.objects.filter(id__lte=7)
    
    # in
    query = models.Student.objects.filter(id__in=[7, 8, 9])  # id值等于这三个里面的任意一个的对象
    
    # 范围  相当于between...and...
    query = models.Student.objects.filter(id__range=[5,10])  # id值在[5,10]内的
    
    # 找name字段里有'相玺'的对象,只适用于字符串类型的字段
    query = models.Student.objects.filter(name__contains='相玺')
    
    # contains基础上 + 不区分大小写
    query = models.Student.objects.filter(name__icontains='python')
    
    # 找name字段以'相'开头的对象, istartswith 不区分大小写
    query = models.Student.objects.filter(name__startswith='相')
    
    # 找name字段以'飞'结尾的对象, iendswith 不区分大小写
    query = models.Student.objects.filter(name__endswith='飞')
    
    # 日期结合__查询:
    # 找出生年为2000,月为07月的
    query = models.Birthday.objects.filter(date__year='2000',date__month='07')
    # 找出生年为2000,月为07月,日大于10的
    query = models.Birthday.objects.filter(date__year='2000',date__month='07',date__day__gt='10')
    
    # 以此类推......
    
  • 相关阅读:
    ZROI NOI2019集训汇总
    牛客 在二叉树中找到累加和为指定值的最长路径长度
    牛客 遍历二叉树的神级方法
    牛客 打印二叉树边界节点
    牛客 实现二叉树先序,中序和后序遍历
    LeetCode K个一组翻转链表
    LeetCode 相交链表&环形链表II
    LeetCode 分隔链表
    LeetCode 复制带随机指针的链表
    LeetCode 回文链表
  • 原文地址:https://www.cnblogs.com/straightup/p/13425561.html
Copyright © 2020-2023  润新知