• Django models 单表查询


    从数据库中查询出来的结果一般是一个集合,这个集合叫做 QuerySet

    • 1. 查看Django QuerySet执行的SQL

    .query.__str__()或 .query属性打印执行的sql语句

    from quicktool.models import User
    from django.http import HttpResponse
    Creat = User.objects.all().filter(created=1557222940).query.__str__()
    return HttpResponse(str(Creat))
    #输出结果:SELECT `user`.`表字段1`, `user`.`表所有字段`, FROM `user` WHERE `user`.`created` = 1557222940
    
    • 2. Django manage.py 提供shell模式

    进入Django的manage.py所在目录执行 python manage.py shell 进入shell模式

    C:Usersadmin>d:
    D:>cd D:django_testmytestsite
    D:django_testmytestsite>python manage.py shell
    Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    (InteractiveConsole)
    >>>
    

      

    • 3. values()返回字典和values_list()返回元组

    * 3.1 普通的模型对象

    普通的模型对象---用shell模式打印结果

    >>> from quicktool.models import User
    >>> TodayCreat = User.objects.filter(created=1488356162)
    >>> print(type(TodayCreat))
    <class 'django.db.models.query.QuerySet'>
    >>> print(TodayCreat)
    <QuerySet [<User: User object (63)>]>

    普通的模型对象---用视图网址展示结果

    from quicktool.models import User
    from django.http import HttpResponse
    def TodayCreat(request):
    TodayCreat = User.objects.filter(created=1488356162)
    return HttpResponse(TodayCreat)
    # 浏览器展示结果:User object (63)
    

      

    * 3.2 values()

    values()返回一个ValuesQuerySet(QuerySet的一个子类),迭代时返回字典,而不是模型实例对象
    每个字典表示一个对象,键对应于模型对象的属性名称

    >>> from quicktool.models import User
    >>> TodayCreat = User.objects.filter(created=1488356162).values()
    >>> print(type(TodayCreat))
    <class 'django.db.models.query.QuerySet'>
    >>> print(TodayCreat)
    <QuerySet [{'id':63, 'name':'xili','sex':'男'}]>

    values()返回字典---用视图网址展示结果

    from quicktool.models import User
    from django.http import HttpResponse
    def TodayCreat(request):
    TodayCreat = User.objects.filter(created=1488356162).values()
    return HttpResponse(TodayCreat)
    # 浏览器展示结果:{'id':63, 'name':'xili','sex':'男'}

    values(*fields),指定过滤哪些字段,返回的字典将只包含指定的字段的键和值

    如果没有指定字段,返回的每个字典将包含数据表中所有字段的键和值

    >>> from quicktool.models import User
    >>> TodayCreat = User.objects.filter(created=1488356162).values('id','name')
    >>> print(type(TodayCreat))
    <class 'django.db.models.query.QuerySet'>
    >>> print(TodayCreat)
    <QuerySet [{'id': 63, 'name': 'xili'}]>

    values(*fields)返回字典---用视图网址展示结果

    from quicktool.models import User
    from django.http import HttpResponse
    def TodayCreat(request):
    TodayCreat = User.objects.filter(created=1488356162).values('id','name')
    return HttpResponse(TodayCreat)
    # 浏览器展示结果:{'id':63, 'name':'xili'}
    

      

    * 3.3 values_list()

    values_list()迭代时返回元组,而不是字典

    >>> from quicktool.models import User
    >>> TodayCreat = User.objects.filter(created=1488356162).values_list()
    >>> print(type(TodayCreat))
    <class 'django.db.models.query.QuerySet'>
    >>> print(TodayCreat)
    <QuerySet [(63, 'xili','男')]>

    values_list()返回元组---用视图网址展示结果

    from quicktool.models import User
    from django.http import HttpResponse
    def TodayCreat(request):
    TodayCreat = User.objects.filter(created=1488356162).values()
    return HttpResponse(TodayCreat)
    # 浏览器展示结果:(63,'xili','男')

    values_list(*fields),指定过滤哪些字段,返回的元组将只包含指定的字段的键和值

    如果没有指定字段,返回的每个元组将包含数据表中所有字段的键和值

    >>> from quicktool.models import User
    >>> TodayCreat = User.objects.filter(created=1488356162).values_list('id','name')
    >>> print(type(TodayCreat))
    <class 'django.db.models.query.QuerySet'>
    >>> print(TodayCreat)
    <QuerySet [(63, 'xili')]>

    values_list(*fields)传字段参数,不传flat参数,返回元组---用视图网址展示结果

    from quicktool.models import User
    from django.http import HttpResponse
    def TodayCreat(request):
    TodayCreat = User.objects.filter(created=1488356162).values('id','name')
    return HttpResponse(TodayCreat)
    # 浏览器展示结果:(63,'xili')

    values_list(*fields),*fields如果只传递一个字段,则可以传递flat参数为True,它表示返回的结果为单个值,而不是元组。

    >>> from quicktool.models import User
    >>> TodayCreat = User.objects.filter(created=1488356162).values_list('name',flat=True)
    >>> print(type(TodayCreat))
    <class 'django.db.models.query.QuerySet'>
    >>> print(TodayCreat)
    <QuerySet ['xili']>

    values_list(*fields)既传字段参数又传flat参数,返回元组---用视图网址展示结果

    from quicktool.models import User
    from django.http import HttpResponse
    def TodayCreat(request):
    TodayCreat = User.objects.filter(created=1488356162).values('name',flat=True)
    return HttpResponse(TodayCreat)
    # 浏览器展示结果:xili

    注:values_list(*fields),*fields如果传递了多个字段,再传递flat则会报错

    TypeError: 'flat' is not valid when values_list is called with more than one field.
    

    >values和values_list返回结果类型上的差别:

    * vlaues -

    单条记录 - <class 'dict'>

    多条记录 - <class 'django.db.models.query.QuerySet'>

    * vlaues_list -

    单条记录 - <class 'tuple'>

    多条记录 - <class 'django.db.models.query.QuerySet'>

    • 4. 获取对象的方法
    # all():查询所有结果
    Person.objects.all() # 查询所有的Person条目
    Person.objects.all()[:10] #切片操作,获取10个人,不支持负索引,切片可以节约内存,不支持负索引
    
    # get(**kwargs):返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误
    Person.objects.get(name="xili") # 名称为 xili的一条,多条会报错
    
    # filter(**kwargs):返回与所给筛选条件相匹配的对象
    Person.objects.filter(name="abc") # 等于Person.objects.filter(name__exact="abc") 名称严格等于 "abc" 的人
    Person.objects.filter(name__iexact="abc") # 名称为 abc 但是不区分大小写,可以找到 ABC, Abc, aBC,这些都符合条件
    Person.objects.filter(name__contains="abc") # 名称中包含 "abc"的人
    Person.objects.filter(name__icontains="abc") #名称中包含 "abc",且abc不区分大小写
    Person.objects.filter(name__regex="^abc") # 正则表达式查询
    Person.objects.filter(name__iregex="^abc")# 正则表达式不区分大小写
    Person.objects .filter(creat__gt=1488356162) # creat时间大于某个时间戳
    Person.objects .filter(creat__gte=1488356162) # creat时间大于等于某个时间戳
    Person.objects .filter(creat__lt=1488356162) # creat时间小于某个时间戳
    Person.objects .filter(creat__lte=1488356162) # creat时间小于等于某个时间戳
    Person.objects .filter(creat__range=(start_time, end_time)) # creat时间在start_time和end_time范围内
    
    # exclude(**kwargs):返回与所给筛选条件不匹配的对象
    Person.objects.exclude(name__contains="WZ") # 排除包含 WZ 的Person对象
    Person.objects.filter(name__contains="abc").exclude(age=23) # 找出名称含有abc, 但是排除年龄是23岁的
    

      

    • 5. order_by():查询结果排序,升序或降序
    # order_by('-id')倒序,order_by('id')升序
    # 元组升降序
    User.objects.filter(Class_id=5).values_list('id').order_by('-id')
    打印结果:(167,)(158,)(144,)(142,)(141,)(140,)(139,)(138,)(137,)(136,)(135,)(118,)(68,)
    User.objects.filter(Class_id=5).values_list('id').order_by('id')
    打印结果:(68,)(118,)(135,)(136,)(137,)(138,)(139,)(140,)(141,)(142,)(144,)(158,)(167,)
    # 字典也能升降序
    User.objects.filter(Class_id=5).values('id').order_by('id')
    打印结果:{'id': 68}{'id': 118}{'id': 135}{'id': 136}{'id': 137}{'id': 138}{'id': 139}{'id': 140}{'id': 141}{'id': 142}{'id': 144}{'id': 158}{'id': 167}
    
    • 6. QuerySet 不支持负索引,①reverse():对查询结果反向排序 ②order_by():降序
    Person.objects.all()[:10] #切片操作,前10条
    Person.objects.all()[-10:] #会报错!提示Negative indexing is not supported.
    
    # 1. 使用 reverse() 解决
    Person.objects.all().reverse()[:2] # 最后两条
    Person.objects.all().reverse()[0] # 最后一条
    
    # 2. 使用 order_by() 解决
    Author.objects.order_by('-id')[:20] # id最大的20条
    
    • 7. QuerySet 支持链式查询
    Plan.objects.all().filter(status=3).filter(created__lte=1557331200).filter(finished__gte=1557417599)
    User.objects.all().values('created').annotate(count=Count('created')).values('created','count')
    Person.objects.filter(name__contains="abc").exclude(age=23)
    
    • 8. 去重

    ① distinct():从返回结果中剔除重复纪录

    qs1 = Pathway.objects.filter(label__name='x')
    qs2 = Pathway.objects.filter(reaction__name='A + B >> C')
    qs3 = Pathway.objects.filter(inputer__name='xili')
    
    # 合并到一起
    qs = qs1 | qs2 | qs3
    这个时候就有可能出现重复的
    
    # 去重方法
    qs = qs.distinct()

    ② set():python内置函数,创建一个无序不重复的集合

    select_UserID = Pathway.objects.filter(inputer__name='xili')
    set(select_UserID)
    

     

    • 9. list(): 强行将QuerySet变为列表
    select_UserID = Pathway.objects.filter(inputer__name='xili')
    list(select_UserID)
    #结果打印[(532,), (671,), (797,), (532,)]
    #原先未转变前打印((532,), (671,), (797,), (532,))
    

      

    • 10. 统计数量

    ① count():返回数据库中匹配查询(QuerySet)的对象数量

    User.objects.all().filter(created__range=(today_start_time, today_end_time)).count()

    ② len():将元组、字典或list统计元素个数

    select_UserID = Pathway.objects.filter(inputer__name='xili')
    len(select_UserID)
    

      

    • 11. first(): 返回第一条记录;last(): 返回最后一条记录
    Pathway.objects.filter(inputer__name='xili').first()
    Pathway.objects.filter(inputer__name='xili').last()
    

      

    • 12. exists(): 如果QuerySet包含数据,就返回True,否则返回False
    from quicktool.models import User
    from django.http import HttpResponse
    TodayCreat = User.objects.all().filter(created__range=(today_start_time, today_end_time)).exists()
    return HttpResponse(count_TodayCreat)
    #能查询出数据则结果为True,不能查询出数据则返回False
    
    • 13. QuerySet 是可迭代的
    es = Entry.objects.all()
    for e in es:
    print(e.headline)
    
  • 相关阅读:
    c#9
    Jmeter--自己写并发压测脚本一定会遇到的类
    Jmeter从数据库获取测试数据, 作为下一个接口参数方法
    Jmeter-从数据库中获取数据并作为变量传输
    Java文件操作
    Java读取文件
    Java字符串处理——String类常用方法
    Eclipse导出可执行jar包步骤
    批处理常用DOS命令之for简单 002
    批处理常用DOS命令之for简单 001
  • 原文地址:https://www.cnblogs.com/kristin/p/10985946.html
Copyright © 2020-2023  润新知