preface

Django提供了强大的ORM,我们可以通过ORM快速的写出我们想要对数据做什么样操作的代码。下面就说说我在日常工作中的用法:

外键关联精确查询

应用场景:表A host字段关联到了表B,在进行查询host的时候,那么就需要来查询表B里面的字段,那么就看看代码。
在models.py文件里,表一结构如下:

class DockerContainers(models.Model):'''用来记录docker容器信息的'''Real_host_ip = models.ForeignKey(DockerOfHost,verbose_name='Docker宿主机IP')  # 外键关联到了另一张表Container_id = models.CharField(u'容器ID',max_length=400,primary_key=True,unique=True)Container_name = models.CharField(u'容器名字',max_length=300,null=True,blank=True)Container_image = models.CharField(u'容器镜像',max_length=300)Container_Image_id = models.CharField(u'镜像ID',max_length=500,null=True,blank=True)Command = models.CharField(u'运行的命令',max_length=300,null=True,blank=True)Created = models.CharField(u'创建时间',max_length=200)Status = models.CharField(u'运行状态',max_length=100,null=True,blank=True)Port = models.CharField(u'容器端口',max_length=1000,null=True,blank=True)SizeRw = models.IntegerField(null=True,blank=True)SizeRootFs = models.IntegerField(null=True,blank=True)Host_config = models.CharField(u'主机配置',max_length=1024,null=True,blank=True)Network_settings = models.CharField(u'网络配置',max_length=3000,null=True,blank=True)Mounts = models.CharField(u'挂载目录',max_length=1024,null=True,blank=True)Record_time = models.DateTimeField(u'数据更新时间',auto_now=True)def __str__(self):return "%s:%s"%(self.Real_host_ip,self.Container_id)class Meta:verbose_name = "Docker容器信息"verbose_name_plural = "Docker容器信息"

在models.py文件里,表二结构如下:

class DockerOfHost(models.Model):host_ip = models.CharField(u'Docker宿主机IP',max_length=250,unique=True)def __str__(self):return self.host_ipclass Meta:verbose_name = "Docker宿主机IP"verbose_name_plural = "Docker宿主机IP"

在views.py里的代码:

models.DockerContainers.objects.filter(Real_host_ip__host_ip__exact=k)  # k是一个变量

解释下:Real_host_ip表示是DockerContainers表(你现在要查询的表)的外键关联字段,Real_host_ip与host_ip之间用了两个下划线( __ )表示是从Real_host_ip字段的外键关联的表(DockerOfHost)查询host_ip字段,两个下划线( __ )是Django保留字段,含有特殊意义,在这里代表查询某一个外建表的某一个字段。exact是精确匹配上。

复杂条件查询之 同表不同字段的或关系查询

应用场景: 前端提交一个请求,需要在一张表里搜索一个容器的ID或者容器的name,此时就需要使用或关系了,匹配到了容器ID或者容器name那么就返回一个值。
对于上面的场景,django同样支持复杂查询通过使用Q。下面看看代码
views.py的代码如下:

from django.db.models import Q
infos = models.DockerContainers.objects.filter(Q(Container_name__contains=ci)|Q(Container_id__startswith=ci))

解释下:Container_name是DockerContainers表的一个字段,__contains表示是包含指定的内容,注意是2个下划线。中间用了一个管道符|表示或关系,__startswith表示匹配指定内容的开头,也是2个下划线。这里就是使用了Q来做或关系,每个Q里面包含一个搜索条件。上面那段代码等同于这个SQL语句:

select * from DockerContainers  WHERE Container_name LIKE '%ci%' OR Container_id LIKE 'ci%'

更多的Q使用方法,可以参考官网:https://docs.djangoproject.com/en/1.10/topics/db/queries/#complex-lookups-with-q (到这个页面搜索import Q即可找到)

6 Django系列之关于models的sql语句日常用法总结相关推荐

  1. mysql查询第10到第20条记录_“取出数据表中第10条到第20条记录”的sql语句+selecttop用法...

    1.首先,select top用法: 参考问题 select top n * from和select * from的区别 select * from table -- 取所有数据,返回无序集合 sel ...

  2. SQL 语句的用法用途

    ###**SQL 语句关键字 [排序] **### ####**1.以SQL语句的书写顺序排序下列SQL语句关键字limit.left.join.order by.group by.where.sel ...

  3. MyBatis-动态sql语句-if用法——MySQL系列学习笔记

    select 根据传入的参数来决定:如果用户名不为空,则对用户名进行模糊查询,如果邮箱不为空,则以邮箱为查询条件 <select id="selectByUser" para ...

  4. sql 语句as用法

    as可以理解为用作,当做,一般用作重命名列名或表名. 例:select column_1 as 列1,column_2 as 列2 from table 上面的语句可以理解为选择column_1作为列 ...

  5. sqlite3的sql语句用法总结与SQLite生成.db-journal文件问题【原创】

    Author:张继飞 这几天遇到了一个问题就是在insert以及update数据的时候,总是生成一个.db-journal文件,重新启动程序后,该文件消失,前面添加修改的数据没有成功保存.关于如何解决 ...

  6. mysqls为node.js而编写的sql语句生成插件 crud for mysql.

    mysqls It is written in JavaScript,crud for mysql.You can also use transactions very easily. mysqls ...

  7. python命令行调试django代码_Django shell调试models输出的SQL语句方法

    在settings.py里,配置如下logging: LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': ...

  8. django 使用原生SQL语句反向生成MODELS.PY中的表结构

    在一次工作中,有这么一个问题,就是要导入的数据字段不确定,但是还想使用django的ORM来对数据进行操作.. 琢磨了许久,弄个不完善的方案,但功能是能实现的,主要是思路.废话不多说了,丑陋的展示一下 ...

  9. django 默认查询条件_Python之Django系列-创建第一个应用-4

    上一篇:Python之Django系列-创建第一个应用-3 上一篇文章我们介绍了创建项目,打开浏览器访问http://127.0.0.1:8000/polls/,能看见"投票主页视图&quo ...

最新文章

  1. 【ACM】杭电OJ 2020(排序)
  2. 程序员必知的8大排序(二)-------简单选择排序,堆排序(java实现)
  3. java fx 插件,JAVA FX 應用程序基礎
  4. select ...as_一起使用.select .map和.reduce方法可充分利用Ruby
  5. matlab的示波器保存figure图像
  6. [USACO09OCT]热浪Heat Wave
  7. 【写作技巧】计算机应用技术毕业论文范文
  8. git修改本地仓库和远程仓库名称
  9. C++ 模板和 C# 泛型之间的区别(C# 编程指南)
  10. vector容器v1、v2之间相互赋值的三种方法及易错点详解
  11. 什么叫运营---一个人,一张网,一艘船,独钓寒江雪!
  12. VB.net,VB2005实现TCP协议编程
  13. 桌面计算机图标变黑块,电脑中的文件夹图标变成黑色的方块的四种解决方法
  14. Java版俄罗斯方块
  15. 红米Redmi K40手机刷入Magisk获取Root教程
  16. 2022年版中国腰果酚市场趋势研究与竞争策略分析报告
  17. EOS Wallet 操作
  18. FTP连接时出现“227 Entering Passive Mode” 的解决方法
  19. mac创建文件服务器,mac命令行终端怎么创建文件 mac命令行终端创建文
  20. 核电站计算机专业是干什么的,什么叫核电站?它是干什么用的呢?

热门文章

  1. html中select标签乱码,select 的过程中中文乱码有关问题求教
  2. 计算机英语口试,英语口试面对“电脑考官”有哪些临场应试技巧
  3. finally 嵌套_学习 Rust【2】减少代码嵌套
  4. linux eth0 目录,教程 | Linux常用命令大全
  5. oracle count over partition by,over (Partition by...) of oracle
  6. calendar.getinstance()获取的是什么时间_时间管理技能培训.ppt
  7. xml文件修改逆向android,Android逆向重置版(2)—起源
  8. PHP代码审计弱类型,[代码审计]php弱类型总结
  9. 获取页面中超链接数量_微信订阅号自定义菜单添加页面模板使用教程。
  10. action链接html,如何使用@ html.actionlink删除链接文本