最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Django中的ORM之查

    正文概述 尤及   2020-12-15   517

    Django中的ORM之查

    Django中的ORM之查:

    1、对象查询

     正向查找

    res1=Book.objects.first()
    print(res1.title)
    print(res1.price)
    print(res1.publish)
    print(res1.publisher.name)#因为一对多的关系,所以res1.publisher是一个对象,不是一个QuerySet集合

    反向查找

    res2=Publish.objects.last()
    print(res2.name)
    print(res2.city)
    print(res2.book_set.all())#res2.book_set是一个QuerySet集合,所以会打印集合中的所有对象元素

    2、双下划綫(_)查询

    双下划线(__)之单表条件查询

    例子:

    table1.objects.filter(id__lt=10,id__gt=1)#获取id小于10,且大于1的记录
    table1.objects.filter(id__in=[11,22,33,44])#获取id在[11,22,33,44]中的记录
    table1.objects.exclude(id__in=[11,22,33,44])#获取id不在[11,22,33,44]中的记录
    table1.objects.filter(name__contains="content1")#获取name中包含有"contents"的记录(区分大小写)
    table1.objects.filter(name__icontains="content1")#获取name中包含有"content1"的记录(不区分大小写)
    table1.objects.filter(id__range=[1,4])#获取id在1到4(不包含4)之间的的记录

    可使用的条件:

    startswith# 指定开头的匹配条件
    istartswith# 指定开头的匹配条件(忽略大小写)
    endswith# 指定结束的匹配条件
    iendswith# 指定结束的匹配条件(忽略大小写)

    双下划线(__)之多表条件查询

    正向查找(条件)之一对一查询

    #查询书名为"python"的书的id号res3=Book.objects.filter(title="python").values("id")
    print(res3)

    正向查找(条件)之一对多查询

    #查询书名为"python"的书对应的出版社的地址res4=Book.objects.filter(title="python").values("publisher__city")
    print(res4)#查询"aaa"作者所写的所有的书的名字res5=Book.objects.filter(author__name="aaa").values("title")
    print(res5)#查询"aaa"作者所写的所有的书的名字(与上面的用法没区别)res6=Book.objects.filter(author__name="aaa").values("title")
    print(res6)

    反向查找之一对多查询

    #查询出版了书名为"python"这本书的出版社的名字
    res7=Publisher.objects.filter(book__title="python").values("name")
    print(res7)
    #查询写了书名为"python"的作者的名字
    res8=Publisher.objects.filter(book__title="python").values("book__authors")
    print(res8)

    反向查找之多对多查询

    #查询所写的书名为"python"的作者的名字
    res9=Author.objects.filter(bool__title="python").values("name")
    print(res9)

    条件查询即与对象查询对应,是指filter,values等方法中的通过__来明确查询条件

    3、聚合查询和分组查询

    aggregate(*args,**kwargs)

    通过到QuerySet进行计算,返回一个聚合值的字典,aggregate()中的每一个参数都指定一个包含在字典中的返回值,即在查询集合中生成聚合

    例子:

    from django.db.models import Avg,Max,Min,Sum#计算所有书籍的平均价格,书籍最高的价格和最低价格
    res1=Book.objects.all().aggregate(Avg("price"),Max("price"),Min("price"))
    print(res1)#打印为"{'price__avg':xxx,'price__max':xxx,'price__min':xxx}"

    Django的查询语句提供了一种方式描述所有图书的集合

    aggregate()子句的参数可以指定想要计算的聚合值.
    aggregate()是QuerySet的一个终止子句,返回一个包含一些键值对的字典.
    字典的键的名称是聚合值的标识符,是按照字段和聚合函数的名称自动生成出来的.
    字典的值是计算出来的聚合值.

    可以为聚合值指定一个名称.

    #计算所有书籍的平均价格,并给书籍的平均价格起一个别名
    res2=Book.objects.all().aggregate(average__price=Avg("price"))
    print(res2)#打印为"{'average_price':xxx}"

    annotate(*args,**kwargs)

    可以通过计算查询结果中每一个对象所关联的对象集合,从而得出总计值(也可以是平均值或总和),即为查询集的每一项生成聚合

    #查询作者"aaa"所写的所有的书的名字
    res3=Book.objects.filter(authors__name="aaa").values("title")
    print(res3)
    #查询作者"bbb"所写的所有的书的总价格
    res4=Book.objects.filter(authors__name="bbb").aggregate(Sum("price"))
    print(res4)

    查询各个作者所写的书的总价格,就要使用分组

    #查询每个作者所写的所有书籍的总价格
    res5=Book.objects.values("authors__name").annotate(Sum("price"))
    print(res5)
    #查询各个出版社所出版的书籍的总价格
    res6=Book.objects.values("Publish__name").annotate(Min("price"))
    print(res6)

    4、F查询和Q查询

    F查询专门取对象中某列值的操作

    #导入F
    from django.db.models import F
    #把table1表中的num列中的每一个值在的基础上加10
    table1.objects.all().update(num=F("num")+10)

    Q构建搜索条件

    #导入Q
    from django.db.models import Q

    Q对象可以对关键字参数进行封装,从而更好的应用多个查询#查询table2表中以"aaa"开头的所有的title列

    q1=table2.objects.filter(Q(title__startswith="aaa")).all()print(q1)

    Q对象可以组合使用&,|操作符,当一个操作符是用于两个Q对象时,会产生一个新的Q对象

    #查找以"aaa"开头,或者以"bbb"结尾的所有title
    Q(title__startswith="aaa") | Q(title__endswith="bbb")

    Q对象可以用"~"操作符放在表达式前面表示否定,也可允许否定与不否定形式的组合

    #查找以"aaa"开头,且不以"bbb"结尾的所有title
    Q(title__startswith="aaa") & ~Q(title__endswith="bbb")

    Q对象可以与关键字参数查询一起使用,Q对象放在关键字查询参数的前面

    查询条件:

    #查找以"aaa"开头,以"bbb"结尾的title且书的id号大于4的记录
    Q(title__startswith="aaa") | Q(title__endswith="bbb"),book_id__gt=4

    更多Python知识,请关注:Python自学网!!


    起源地下载网 » Django中的ORM之查

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元