美文网首页
Python Web框架 Django - Django查询相关

Python Web框架 Django - Django查询相关

作者: 莫名ypc | 来源:发表于2018-11-28 19:40 被阅读0次

    django查询

    filter:查询满足条件的对象,得到QuerySet,查询结果不存在时,得到QuerySet[]

    # 查询年龄等于18的信息
     stus = Student.objects.filter(age=18)
    

    exclude: 查询不满足条件的对象, 结果得到QuerySet

    # 获取不叫小小明的学生的信息
    stus = Student.objects.exclude(name='小小明')
    

    get:获取唯一的满足条件的对象,且查询的条件必须存在如果查询结果多于一个,则报错

    # 查询name=xx的学生信息
    stu = Student.objects.get(name='小小明')
    

    first() : 获取结果中的第一个
    last() : 获取结果中的最后一个
    all() : 获取所有

    多条件查询:
    对象.objects.filter(条件1).filter(条件2) 或者
    对象.objects.filter(条件1, 条件2)

        # 查询年龄等于18且性别为女的学生信息
        stus = Student.objects.filter(age=18).filter(gender=0)
        stus = Student.objects.filter(age=18, gender=0)
    

    排序:order_by
    对象.objects.order_by(条件):按条件升序
    对象.objects.order_by(-条件):按条件降序

        # 排序order_by, 降序-id,在SQL中id desc,升序id, 在SQL中 id asc
        stus = Student.objects.all().order_by('-id')
    

    是否存在:exists
    有值返回True,没有值返回False

        # 判断name=王昭君 的学生存不存在, 存在返回True,不存在返回False
        stu = Student.objects.filter(name='王昭君').exists()
        if stu:
            print('1')
        else:
            print('2')
    

    获取对象的值,结果是字典

        # 获取对象的值
        stus_value = Student.objects.all().values()
    

    比较运算:
    contains:是否包含,大小写敏感
    icontains:是否包含,大小写不敏感
    startwith,endwith:以values开头或结尾,大小写敏感

        # 查询姓名中包含’大‘的学生信息
        # 类似于 like '%大%'
        stus = Student.objects.filter(name__contains='大')
    
        # 类似于like'%大'
        stus = Student.objects.filter(name__endswith='大')
    
        # 类似于like'大%'
        stus = Student.objects.filter(name__startswith='大')
    

    __in方法:

    # sql:select * from xxx where id in (1,2,3)
    stus = Student.objects.filter(id__in=[1, 2])
    
    stus = Student.objects.filter(pk__in=[1, 2])
    

    大于:gt, 大于等于gte
    小于:lt, 小于等于lte

    stus = Student.objects.filter(age__lte=19)
    

    查询平均年龄

    stus = Student.objects.all()
    ages = 0
    for stu in stus:
         ages += stu.age
    avg_age = ages / len(stus)
    

    聚合aggregate

    avg_age = Student.objects.all().aggregate(Avg('age'))
    sum_age = Student.objects.all().aggregate(Sum('age'))
    

    或者条件、非条件、并且条件
    查询age=18或者gender=1的学生信息
    Q()
    from django.db.models import Q

    stus = Student.objects.filter(Q(age=18), Q(gender=1))
    
    stus = Student.objects.filter(Q(age=18) & Q(gender=1))
    
    stus = Student.objects.filter(Q(age=18) | Q(gender=1))
    
    stus = Student.objects.filter(~Q(age=18) | Q(gender=1))
    

    查询语文成绩比数学成绩大的学生信息
    F()
    from django.db.models import F

    stus = Student.objects.filter(chinese__gt=F('math'))
    
    # 查询语文成绩比数学成绩大10分的学生信息
    stus = Student.objects.filter(chinese__gt=F('math') + 10)
    

    模型的一对一关系以及一对一关系的多表查询

    一对一模型的定义:
    OneToOne等价于 foreign_key, 且约束unique=True

    class StuInfo(models.Model):
        phone = models.CharField(max_length=11)
        address = models.CharField(max_length=50)
        # OneToOne等价于  foreign_key, 且约束unique=True
        stu = models.OneToOneField(Student)
    
        class Meta:
            db_table = 'stu_info'
            verbose_name = '学生信息拓展'
            verbose_name_plural = '学生信息拓展'
    

    一对一关系的多表查询:
    正向查询:

    def sel_info_by_stu(request):
        # 通过学生信息查拓展表信息
        # 查询大明的电话号码
        stu = Student.objects.filter(name='貂蝉').first()
        # 第一种方法
        # stu_info = StuInfo.objects.filter(stu_id=stu.id).first()
        # stu_info = StuInfo.objects.filter(stu=stu).first()
        # phone = stu_info.phone
    
        # 第二种方法
        stu_info = stu.stuinfo
        phone = stu_info.phone
        return HttpResponse(phone)
    

    反向查询:

    def sel_by_info(request):
        # 查询号码为6543210的学生信息
        stu_info = StuInfo.objects.get(phone='6543210')
        stu = stu_info.stu
        name = stu.name
        return HttpResponse(name)
    

    常用的方法:

    方法 用法
    __exact 精确等于 like ‘aaa’
    __iexact 精确等于 忽略大小写 ilike ‘aaa’
    __contains 包含 like ‘%aaa%’
    __icontains 包含 忽略大小写 ilike ‘%aaa%’,但是对于sqlite来说,contains的作用效果等同于icontains。
    __gt 大于
    __gte 大于等于
    __lt 小于
    __lte 小于等于
    __in 存在于一个list范围内
    __startswith 以…开头
    __istartswith 以…开头 忽略大小写
    __endswith 以…结尾
    __iendswith 以…结尾,忽略大小写
    __range 在…范围内
    __year 日期字段的年份
    __month 日期字段的月份
    __day 日期字段的日
    __isnull=True/False __isnull=True 与 __exact=None的区别

    返回新的QuerySet的API

    方法名 解释
    filter() 过滤查询对象
    exclude() 排除满足条件的对象
    annotate() 使用聚合函数
    order_by() 对查询集进行排序
    reverse() 反向排序
    distinct() 对查询集去重
    values() 返回包含对象具体值的字典的QuerySet
    values_list() 与values()类似,只是返回的是元组而不是字典
    dates() 根据日期获取查询集
    datetimes() 根据时间获取查询集
    none() 创建空的查询集
    all() 获取所有的对象
    union() 并集
    intersection() 交集
    difference() 差集
    select_related() 附带查询关联对象
    prefetch_related() 预先查询
    extra() 附加SQL查询
    defer() 不加载指定字段
    only() 只加载指定的字段
    using() 选择数据库
    select_for_update() 锁住选择的对象,直到事务结束
    raw() 接收一个原始的SQL查询

    相关文章

      网友评论

          本文标题:Python Web框架 Django - Django查询相关

          本文链接:https://www.haomeiwen.com/subject/zxqaqqtx.html