广告
返回顶部
首页 > 资讯 > 数据库 >django的数据库ORM进阶操作
  • 562
分享到

django的数据库ORM进阶操作

摘要

1、数据库查询的三种方式 正向查询: (1)获取全部数据all     v1=models.UserInfo.objects.all().first()    #取出Querryset类型数据,里面是对象,需循环取出     v1.ut 


	django的数据库ORM进阶操作
[数据库教程]

1、数据库查询的三种方式

正向查询:

(1)获取全部数据all

    v1=models.UserInfo.objects.all().first()    #取出Querryset类型数据,里面是对象,需循环取出

    v1.ut    #跨表,ut是外键

(2)只取部分字段value,  外键__字段

    v2=models.UserInfo.objects.values("id","name","ut__title")   #取出的是Querryset类型数据,里面是字典[{‘id‘:1,"name‘:"运维"},{}]

    for i in v2:

      print(i["ut__title"])

(3)获取元组格式value_list, 外键__字段

    v3=models.Business.objects.value_list("id","name","ut__title")  #取出的是Querryset类型数据,里面是元组[(1,运维),(2,开发),]

    for i in v3:

      print(i["ut__title"])

反向查询:

(1)all(),使用  表名小写_set  进行反查

    obj=models.UseType.objects.all().first()

    obj.userinfo_set.all()   #反查出所有,querry对象

(2)values反向查询, 小写的表名

    obj=models.UseType.objects.values("id","title","userinfo")

 

    obj=models.UseType.objects.values("id","title","userinfo__name")

(3)values_list反向查询, 小写的表名

    obj=models.UseType.objects.values_list("id","title","userinfo")

    obj=models.UseType.objects.values_list("id","title","userinfo__name")

 

2、知识点:查看你的代码所执行的sql语句:query

v=models.UserInfo.objects.values(‘ug_id‘)
print(v.query)

 

3、其他操作

(1)order_by:排序 

从小到大:

user_list=models.UserInfo.objects.all().order_by("id")

从大到小:

user_list=models.UserInfo.objects.all().order_by("-id")

设置第二字段排序

user_list=models.UserInfo.objects.all().order_by("-id","name")

 

(2)分组 annotate : 相当于 group_by和having

models.Host.objects.values("linkman").annotate(count=Count("id"))

   #SELECT `cmdb_host`.`linkman_id`, COUNT(`cmdb_host`.`id`) AS `count` FROM `cmdb_host` GROUP BY `cmdb_host`.`linkman_id` ORDER BY NULL

models.Host.objects.values("linkman").annotate(count=Count("id")).filter(count__gt=2)

  #SELECT `cmdb_host`.`linkman_id`, COUNT(`cmdb_host`.`id`) AS `count` FROM `cmdb_host` GROUP BY `cmdb_host`.`linkman_id` HAVING COUNT(`cmdb_host`.`id`) > 2 ORDER BY NULL

 

(3)filter/exclude:where条件

models.Host.objects.values("ip").filter(id="2")

    #SELECT `cmdb_host`.`ip` FROM `cmdb_host` WHERE `cmdb_host`.`id` = 2

models.Host.objects.values("ip").exclude(id="2")

    #SELECT `cmdb_host`.`ip` FROM `cmdb_host` WHERE NOT (`cmdb_host`.`id` = 2)

 

4、高级操作

(1)F:获取原字段原值进行更新操作

v=models.Host.objects.filter(id=2).update(linkman_id=F(‘linkman_id‘)-1)

    #UPDATE `cmdb_host` SET `linkman_id`=`linkman_id`-1 WHERE id=2

(2)Q:用于构造复杂的查询条件,例如应用组合搜索

 

models.Host.objects.filter(Q(id__gt=10)&Q(id__lt=15))

 

   #SELECT `cmdb_host`.`id`, `cmdb_host`.`device_modle`, `cmdb_host`.`use_status`, `cmdb_host`.`device_role`, `cmdb_host`.`ip`, `cmdb_host`.`root_password`, `cmdb_host`.`linkman_id` FROM `cmdb_host` WHERE (`cmdb_host`.`id` > 10 AND `cmdb_host`.`id` < 15)

  技术图片

 

  技术图片

 

(3)extra:更复杂的查询

 

 

 技术图片

(4)使用原生sql语句

指定使用其他数据库

  技术图片

 

技术图片

 

 5、性能优化操作

(1)普通执行all():取得的结果是Querryset对象,但是在执行循环的时候需要连表时一次一次再做连表查询。

(2)select_related:在第一次查询的时候主动做连表,后面循环不需要再去做连表。适合数据比较少的情况

  一次性查询:加select_related(外键)

   技术图片

 

 

(3)prefetch_related:也是在第一次查询的时候查出所有数据,但是形式不是连表,而是做两次单表查询。适合数据量大的情况

  技术图片

 

Django数据库ORM进阶操作

原文地址:https://www.cnblogs.com/chenxiaozan/p/13386547.html

您可能感兴趣的文档:

--结束END--

本文标题: django的数据库ORM进阶操作

本文链接: https://www.lsjlt.com/news/7547.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作