6 Django系列之关于models的sql语句日常用法总结
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_ip
class 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语句日常用法总结的更多相关文章
- Mybatis 系列9-强大的动态sql 语句
[Mybatis 系列10-结合源码解析mybatis 执行流程] [Mybatis 系列9-强大的动态sql 语句] [Mybatis 系列8-结合源码解析select.resultMap的用法] ...
- SQL语句---nvl 用法
SQL语句---nvl 用法 一NVL函数是一个空值转换函数 NVL(表达式1,表达式2) 如果表达式1为空值,NVL返回值为表达式2的值,否则返回表达式1的值. 该函数的目的是把一个空值(nul ...
- SQL 语句日期用法及函数
SQL 语句日期用法及函数 --DAY().MONTH().YEAR()——返回指定日期的天数.月数.年数:select day(cl_s_time) as '日' from class --返回天 ...
- sql语句exists 用法
参考:SQL语句exists用法,Sql语句中IN和exists的区别及应用 现在有三张表 学生表S: sno ,sname 课程表C:cno ,cname 学生选课表SC: sno ,cno 查询选 ...
- django框架 - 实时查看执行的sql语句
django框架采用的ORM模型,我们可以通过mysql的日志记录实时看到执行的sql语句,具体步骤如下: 第一步:找到mysql的配置文件 第二步:编辑mysql配置文件 第三步:重启mysql 第 ...
- SQL语句的用法
1.增加字段 alter table docdsp add dspcodechar(200)2.删除字段 ALTER TABLE table_NAME DROP COLUMNc ...
- SQL语句exists用法
首先头脑中有三点概念: 1 . EXISTS子查询找到的提交 NOT EXISTS 子查询中 找不到的提交 说明:不要去翻译为存在和不存在,把脑袋搞晕. 2 . 建立程序循环的概念,这是一个动态的查 ...
- “取出数据表中第10条到第20条记录”的sql语句+selecttop用法
1.首先,select top用法: 参考问题 select top n * from和select * from的区别 select * from table -- 取所有数据,返回无序集合 sel ...
- Django - 在settings配置终端打印SQL语句
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': { 'level': 'DE ...
随机推荐
- page size == 4096 , nand size == 1GB, block size == 256kb 的ubi 文件系统制作
mkubiimg.sh 2 sudo mkfs.ubifs -F -q -r rootfs_ecm_5410 -m 4096 -e 253952 -c 3600 -o ubifs.img 3 4 ec ...
- C# 不借助第三个变量实现两整数交换
c#中实现两个int变量的数值互换,在借助第三个变量做临时载体的情况下,非常简单. ; ; int c ; c = a; a = b; b = c; 如果不借助第三方变量,有几种实现的方法: 1.异或 ...
- RavenDb学习(一)设计模式介绍
RavenDb是一个文档型的数据库,和芒果Db是一个类型的东西,但是公司选择了它,主要是因为它对事务的支持比较好,芒果Db在事务方面有问题. 下面有一个例子. 在关系型数据库中,我们要展示以上的内容, ...
- JS监听页面----无鼠标键盘动作,自动跳页
function ScreenSaver(settings){ this.settings = settings; this.nTimeout = this.settings.timeout; doc ...
- js android页面被挂起问题解决
问题: 页面上设了定时器,但浏览器后台运行被挂起时,页面定时器暂停 解决: 向服务器发送同步请求,服务器延时1秒返回.页面收到返回时再次发送请求 服务器相当于起博器,维持页面将停的心跳
- Redis 实现消息队列 MQ
Redis 2.4版本之后就内置队列的功能了,如果是日常比较简单的队列应用,可以选择Redis , 效率还很高的!! Redis 还能实现 有序 和 无序 两种队列(只讨论生产者和消费者这种模式的队列 ...
- 常用的HTTP协议状态码
200 - OK,服务器成功返回网页 - Standard response for successful HTTP requests. 301 - Moved Permanently(永久跳 ...
- onClickRow 事件
onClickRow: function (rowIndex, rowData) { dgonClickRow(rowData.oldCityCode,r ...
- QDateTime 本地时间和UTC时间转换问题
先说一下UTC,搜索360百科: 协调世界时,又称世界统一时间.世界标准时间.国际协调时间,简称UTC,是以原子时秒长为基础,在时刻上尽量接近于世界时的一种时间计量系统.1979年12月3日在内瓦举行 ...
- 关于Unity中的光照(四)
渲染路径和颜色空间 1:Unity光影效果可以通过设置 渲染路径和颜色空间;2: 渲染路径: 光照到物体表面,物体着色的时候,算上光的颜色的时候有这么几种光照的着色方式,计算着色的方式 forward ...