zoukankan      html  css  js  c++  java
  • python | Django ORM 模糊查询和查询操作

    模糊查询常用的操作

    Q查询:

    from django.db.models import Q
    Q(question__startswith='What')
    
    Q(question__startswith='Who') | Q(question__startswith='What')
    This is equivalent to the following SQL WHERE clause:
    # 等价于:
    WHERE question LIKE 'Who%' OR question LIKE 'What%'
     
    
    Q(question__startswith='Who') | ~Q(pub_date__year=2018)
     
     
    Poll.objects.get(
        Q(question__startswith='Who'),
        Q(pub_date=date(2018, 8, 8)) | Q(pub_date=date(2018, 8, 6))
    )
    ... roughly translates into the SQL:
     
    SELECT * from polls WHERE question LIKE 'Who%'
        AND (pub_date = '2017-05-02' OR pub_date = '2009-05-06')

    大于、大于等于、小于、小于等于:

    # __gt 大于>
    # __gte 大于等于>=
    # __lt 小于<
    # __lte 小于等于<=
    
    Student.objects.filter(age__gt=10) # 查询年龄大于10岁的学生
    Student.objects.filter(age__gte=10) # 查询年龄大于等于10岁的学生
    Student.objects.filter(age__lt=10) # 查询年龄小于10岁的学生
    Student.objects.filter(age__lte=10) # 查询年龄小于等于10岁的学生
    • 特别注意:这里的下划线是双下划线

    不等于/不包含于:

    Student.objects.filter().excute(age=10)    # 查询年龄不为10的学生
    Student.objects.filter().excute(age__in=[10, 20])  # 查询年龄不在 [10, 20] 的学生

    数据库 like操作 模糊查询常用的操作

    # __exact 精确等于 like 'aaa'
    # __iexact 精确等于 忽略大小写 ilike 'aaa'
    # __contains 包含 like '%aaa%'
    # __icontains 包含,忽略大小写 ilike '%aaa%',但是对于sqlite来说,contains的作用效果等同于icontains。
    # __startswith 以…开头
    # __istartswith 以…开头 忽略大小写
    # __endswith 以…结尾
    # __iendswith 以…结尾,忽略大小写
    # __range 在…范围内
    # __year 日期字段的年份
    # __month 日期字段的月份
    # __day 日期字段的日
    
    
    # 用法:
    Book.objects.filter(title__exact="python")
    #   等价于 title  like  'python'
    Book.objects.filter(title__contains="python")
    #   等价于 title  like  '%python%'
    Book.objects.filter(title__icontains="python")  
    # 忽略大小写 
    Book.objects.filter(title__startswith="py")
    # 等价于  title like 'py%'
    Book.objects.filter(title__endswith="aa")
    # 等价于  title like '%aa'
    
    Book.objects.filter(pub_date__year=2012)
    # 日期字段的2012年份
    
    Student.objects.filter().excute(age=10) # 查询年龄不为10的学生
    Student.objects.filter().excute(age__in=[10, 20]) # 查询年龄不在 [10, 20] 的学生

    是否为空

    User.objects.filter(username__isnull=True) # 查询用户名为空的用户
    User.objects.filter(username__isnull=False) # 查询用户名不为空的用户
    # a)判等 条件名:exact。
    # 例:查询名字为abc的图书。
    BookInfo.objects.filter(name="abc")  #等同于 BookInfo.objects.filter(name__exact="abc") 名称严格等于 "abc" 的人
    BookInfo.objects.filter(name__iexact="abc")  # 名称为 abc 但是不区分大小写,可以找到 ABC, Abc, aBC,这些都符合条件
    
    # b)模糊查询(相当于sql的 like)
    # 例:查询书名包含'传'的图书。contains
    BookInfo.objects.filter(btitle__contains='')
    # 例:查询书名以'部'结尾的图书 endswith 开头:startswith
    BookInfo.objects.filter(btitle__endswith='')
    
    # c)空查询 isnull
    # 例:查询书名不为空的图书。isnull 
    select * from booktest_bookinfo where btitle is not null;
    BookInfo.objects.filter(btitle__isnull=False)
    
    # d)范围查询 in
    # 例:查询id为1或3或5的图书。
    select * from booktest_bookinfo where id in (1,3,5);
    BookInfo.objects.filter(id__in = [1,3,5])
    
    # e)比较查询 gt(greate than) lt(less  than) gte(equal) 大于等于
    # lte 小于等于
    # 例:查询id大于3的图书。
    Select * from booktest_bookinfo where id>3;
    BookInfo.objects.filter(id__gt=3)
    
    # f)日期查询
    # 例:查询1980年发表的图书。
    BookInfo.objects.filter(bpub_date__year=1980)
    # 例:查询1980年1月1日后发表的图书。
    from datetime import date
    BookInfo.objects.filter(bpub_date__gt=date(1980,1,1))
    
    # g)range在...范围内
    BookInfo.objects.filter(name__regex="^abc")  # 正则表达式查询
    BookInfo.objects.filter(name__iregex="^abc")  # 正则表达式不区分大小写
    
    # exclude(返回不满足条件的数据。)方法示例:
    # 例:查询id不为3的图书信息。
    BookInfo.objects.exclude(id=3)
    User.objects.filter().excute(age=10) // 查询年龄不为10的用户
    User.objects.filter().excute(age__in=[10, 20]) // 查询年龄不为在 [10, 20] 的用户
    
    # order_by(对查询结果进行排序)方法示例:
    # 作用:进行查询结果进行排序。默认是升序,在条件里加“-”表示降序
    # 例:查询所有图书的信息,按照id从小到大进行排序。
    BookInfo.objects.all().order_by('id')
    
    # 例:查询所有图书的信息,按照id从大到小进行排序。
    BookInfo.objects.all().order_by('-id')
    
    # 例:把id大于3的图书信息按阅读量从大到小排序显示。
    BookInfo.objects.filter(id__gt=3).order_by('-bread')

    多表连接查询:

     class A(models.Model):
        name = models.CharField(u'名称')
     class B(models.Model):
        aa = models.ForeignKey(A)
     
    B.objects.filter(aa__name__contains='searchtitle')
    # 查询B表中外键aa所对应的表中字段name包含searchtitle的B表对象。
    all():    查询所有结果
    filter(**kwargs):    它包含了与所给筛选条件相匹配的对象
    get(**kwargs):    返回与所给筛选条件相匹配的对象,返回结果有且只有一个, 如果符合筛选条件的对象超过一个或者没有都会抛出错误。
    exclude(**kwargs):    它包含了与所给筛选条件不匹配的对象
    order_by(*field):    对查询结果排序 用法:order_by(’-price’) DESC 降序
    reverse():    对查询结果反向排序
    count():    返回数据库中匹配查询(QuerySet)的对象数量。
    first():    返回第一条记录
    last():    返回最后一条记录
    exists():    如果QuerySet包含数据,就返回True,否则返回False 相当于limit 1(用途查询这个表中是否有值)
    values(*field):    用法:Book.objects.all.values(‘title’,‘price’) 返回值是<queryset[{‘title’:‘aa’,‘pirce’:12},{}]
    values_list(*field):    用法:Book.objects.all.values_list(‘title’,‘price’) 返回值是<queryset[(‘aa’,12),(‘bb’,33)]
    distinct():    从返回结果中剔除重复纪录 用法:Book.objects.all.values(‘title’,‘price’).distinct() 错误用法 Book.objects.all.distinct() 因为id不相同,其他相同,无法去重
    1. exclude():
      # exclude(**kwargs)
      # 返回一个新的QuerySet,它包含不满足给定的查找参数的对象
       
      Student.objects.exclude(age__gt=20, name='lin')#排除所有年龄大于20岁且名字为“lin”的学员集
    2. annotate():

       

    annotate(args, *kwargs)
     
    # 使用提供的聚合表达式查询对象。
    # 表达式可以是简单的值、对模型(或任何关联模型)上的字段的引用或者聚合表达式(平均值、总和等)。
    # annotate()的每个参数都是一个annotation,它将添加到返回的QuerySet每个对象中。
    # 关键字参数指定的Annotation将使用关键字作为Annotation 的别名。 匿名参数的别名将基于聚合函数的名称和模型的字段生成。 只有引用单个字段的聚合表达式才可以使用匿名参数。 其它所有形式都必须用关键字参数。
    # 例如,如果正在操作一个Blog列表,你可能想知道每个Blog有多少Entry:
    >>> from django.db.models import Count
    >>> q = Blog.objects.annotate(Count('entry'))
    # The name of the first blog
    >>> q[0].name
    'Blogasaurus'
    # The number of entries on the first blog
    >>> q[0].entry__count
    42
    1. order_by():
    order_by(*fields)
     
    # 默认情况下,根据模型的Meta类中的ordering属性对QuerySet中的对象进行排序
    Student.objects.filter(school="阳关小学").order_by('-age', 'name')
    # 上面的结果将按照age降序排序,然后再按照name升序排序。"-age"前面的负号表示降序顺序。 升序是默认的。 要随机排序,使用"?",如下所示:
    Student.objects.order_by('?')
    1. reverse():

    # reverse()
    # 反向排序QuerySet中返回的元素。 第二次调用reverse()将恢复到原有的排序。
    # 如要获取QuerySet中最后五个元素,可以这样做:
    my_queryset.reverse()[:5]
    # 这与Python直接使用负索引有点不一样。 Django不支持负索引。

    1. distinct():
    distinct(*fields)
    # 去除查询结果中重复的行。
    # 默认情况下,QuerySet不会去除重复的行。当查询跨越多张表的数据时,QuerySet可能得到重复的结果,这时候可以使用distinct()进行去重。
    1. values():
    values(fields, *expressions)
     
    # 返回一个包含数据的字典的queryset,而不是模型实例。
     
    # 每个字典表示一个对象,键对应于模型对象的属性名称。如:
     
    # 列表中包含的是Student对象
    >>> Student.objects.filter(name__startswith='Lin')
    <QuerySet [<Student: Lin Student>]>
     
    # 列表中包含的是数据字典
    >>> Student.objects.filter(name__startswith='Lin').values()
    <QuerySet [{'id': 1, 'name': 'Linxiao', 'age': 20}]>
     
    # 另外该方法接收可选的位置参数*fields,它指定values()应该限制哪些字段。如果指定字段,每个字典将只包含指定的字段的键/值。如果没有指定字段,每个字典将包含数据库表中所有字段的键和值。如下:
    >>> Student.objects.filter(name__startswith='Lin').values()
    <QuerySet [{'id': 1, 'name': 'Linxiao', 'age': 20}]>
     
    >>> Blog.objects.values('id', 'name')
    <QuerySet [{'id': 1, 'name': 'Linxiao'}]>
    1. values_list():
    values_list(*fields, flat=False)
     
    # 与values()类似,只是在迭代时返回的是元组而不是字典。每个元组包含传递给values_list()调用的相应字段或表达式的值,因此第一个项目是第一个字段等。 像这样:
    >>> Student.objects.values_list('id', 'name')
    <QuerySet [(1, 'Linxiao'), ...]
  • 相关阅读:
    零基础入门学习python--第一章
    mount: no medium found on /dev/sr0 找不到介质
    linux中shell变量$#,$@,$0,$1,$2的含义解释
    ospf多区域实例配置
    Linux查看cpu信息
    ethtool查看网卡以及修改网卡配置
    circusctl命令在ubuntu 上执行,卡住的现象处理。
    ubuntu 16.04.1 LTS zabbix-agent安装
    ubuntu 16.04.1 LTS 初始化
    Ubuntu开机启动的方式
  • 原文地址:https://www.cnblogs.com/huangjiangyong/p/14584737.html
Copyright © 2011-2022 走看看