• Django的ORM查询


    Django的ORM查询

    1.简单查询

    models.Classes.objects.all()   # 相当于select * from classes;
    

    返回的结果是列表里套对象

    models.Classes.objects.values()  # 相当于 select * from classes
    models.Classes.objects.values('name','age')  # 相当于 select name,age from classes,可指定查询的字段
    

    返回的结果是列表里套字典的形式

    models.Classes.objects.values_list()   # 相当于 select * from classes
    models.Classes.objects.values_list('name','age')   # 相当于 select name,age from classes,可指定查询的字段
    

    返回的结果是列表里套元组的形式

    2.distinct

    models.Classes.objects.values('name').distinct()  # select distinct name from classes
    
    models.Classes.objects.values('name','age').distinct()  # 将(name,age)作为一组过滤
    

    3.where

    models.Classes.objects.filter(id=2)  # select * from classes where id = 2
    
    models.Classes.objects.filter(id__gt=2)  # select * from classes where id > 2
    
    models.Classes.objects.filter(id__gte=2)  # select * from classes where id >= 2
    
    models.Classes.objects.filter(id__lt=2)  # select * from classes where id < 2
    
    models.Classes.objects.filter(id__lte=2)  # select * from classes where id <= 2
    
    models.Classes.objects.exclude(id=2)  # select * from classes where id != 2
    
    models.Classes.objects.values().filter(id__lte=2,name='nick')  # select * from classes where id <= 2 and name ='nick'
    

    4.in和not in

    models.Classes.objects.filter(id__in=[2,3])  # select * from classes where id in (2,3)
    
    models.Classes.objects.exclude(id__in=[2,3])  # select * from classes where id not in (2,3)
    

    5.between...and...

    models.Classes.objects.filter(id__range=[1,3])  # select * from classe where id between 1 and 3
    

    6.like

    models.Classes.objects.filter(name__endswith='on')  # select * from classes where name like "%on"
    
    models.Classes.objects.filter(name__iendswith='on')  # select * from classes where name like "%on" 匹配时忽略大小写
    
    models.Classes.objects.filter(name__startswith='aaa')  # select * from classes where name like "aaa%"
    
    models.Classes.objects.filter(name__istartswith='bbb')  # select * from classes where name like "bbb%" 匹配时忽略大小写
    
    models.Classes.objects.filter(name__contains='ccc')  # select * from classes where name like "%ccc%"
    
    models.Classes.objects.filter(name__icontains='ccc')  # select * from classes where name like "%ccc%" 匹配时忽略大小写
    

    7.正则表达式

    models.Classes.objects.filter(name__regex='w+')  # 正则表达式匹配
    
    models.Classes.objects.filter(name__iregex='w+')  # 正则表达式匹配,忽略大小写
    

    8.count

    models.Classes.objects.count()  # select count(*) from classes
    
    models.Classes.objects.filter(id__gt=2).count()  # select count(*) from classes where id > 2
    

    9.order by

    models.Classes.objects.values().order_by('age')  # select * from classes order by age 升序
    
    models.Classes.objects.values().order_by('-age')  # select * from classes order by age desc 降序
    
    models.Classes.objects.values().order_by('age','-id')  # select * from classes order by age asc,id desc 先按age升序排,age相同的按id降序排
    

    10.group by

    from django.db.models import Count,Min,Max,Sum,Avg  
    res = models.Classes.objects.values('name').annotate(s=Sum('age'))  # select name,sum(age) as s from classes group by name; 通过名字分组,在统计每组的年龄之和
    res = models.Classes.objects.values('name').annotate(s=Sum('age')).filter(s__gt=30) # 相当于select name,sum(age) as s from classes group by name having(s>30);
    

    11.limit

    models.Classes.objects.values()[1:3]  # 通过切片获取查询数 select * from classes limit 1,2
    

    12.last:取最后一个,first:取第一个

    models.Classes.objects.last()  # 返回的是最后一个对象
    
    models.Classes.objects.first()  # 返回的是第一个对象
    

    13.only:取指定的字段,返回的是列表套对象

    models.Classes.objects.only('name')  # 只取name字段,但也会查id字段
    

    14.defer:取排除指定的字段后的所有字段,返回的是列表套对象

    models.Classes.objects.defer('name')  # 不查name字段。select id, age from classes。指定为id时无效,还是会显示id字段
    

    15.or

    from django.db.models import Q
    models.Classes.objects.values().filter(Q(id__gte=3)|Q(name='nick'))  # select * from classes where id>=3 or name='nick'
    models.Classes.objects.values().filter((Q(id__gte=3)|Q(name='nick'))&Q(age=19))  # select * from classes where (id>=3 or name='nick') and age=19
    

    16.F

    from django.db.models import F 
    models.Classes.objects.update(age=F('age')+1)  # 将每个人的年龄加1
    

    17.原生sql

    from django.db import connection,connections
    cursor = connection.cursor()  
    # 相当于connections['default'].cursor(),这里的default是settings.py文件中设置的数据库,也可以连接其他的数据库如connections['mymysql'].cursor()
    cursor.execute('''select * from app01_classes where id > %s''',[1])
    res = cursor.fetchall()  # 返回结果是列表套元组的方式
    print(res)
    
  • 相关阅读:
    C#中有关string和byte[]转换的问题
    慎用HyperThreading Technology
    MSN不能登录 解决“0x81000370错误”
    Life Is a Gamble
    Application Wizard生成的项目文件简介
    在Word中如何进行半行输入
    几个有用的短语
    C#学习之接口
    C++中不容易记忆的访问属性问题
    进一步理解VC中的句柄
  • 原文地址:https://www.cnblogs.com/863652104kai/p/11354036.html
Copyright © 2020-2023  润新知