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 ...
随机推荐
- docker打开api remote接口设置
前言 本文记录docker怎么打开api remote接口设置,docker的版本更新太快了,不同的版本之间,设置可能不同,本文是针对docker13.1 1. 查看配置文件位于哪里 systemc ...
- GODOT 3.0 开发进度汇报 #6
经过了又一个月的开发工作,在此作进度报告.本月的工作可以划分为:完成Web导出工具开发.GDNative.以及新的粒子系统. Web Export Godot 现在有了一款实验性的导出工具,导出目标为 ...
- [Linux]如何查看系统的Time Slice
Linux Time Slice 首先,.config中查看kernel configure中CONFIG_HZ值,比如100 然后,查看include/linux/sched/rt.h或者inclu ...
- HTTP1.0/1.1/2.0特性对比_转
转自:HTTP1.0 HTTP1.1 HTTP2.0 主要特性对比 https://segmentfault.com/a/1190000013028798 HTTP1.0 早先1.0的HTTP版本, ...
- valgrind--CPP程序内存泄露检查工具
内存泄漏是c++程序常见的问题了,特别是服务类程序,当系统模块过多或者逻辑复杂后,很难通过代码看出内存泄漏. valgrind是一个开源的,检测c++程序内存泄漏有效工具,编译时加上-g选项可以定位到 ...
- sqlserver查看和解除表死锁
1,查看那个表死锁 select object_name(resource_associated_entity_id) as tableName, request_session_id as pid ...
- FormWindowState.Maximized的陷阱
MDI父窗体下面有很多子窗体.子窗体打开时都是以FormWindowState.Maximized的属性打开的,但是结果部分如意,部分奇怪. 先贴上单实例的代码: static TestForm _s ...
- Git 提交更改
Jerry 已经提交的更改,他想纠正他的最后一次提交,在这种情况下,git 的修改将帮助操作.最后提交修改操作的变化,包括提交信息,它创建新的提交ID. 修改操作之前,他会检查提交日志. [jerry ...
- webpack4--热更新
所谓热更新,就是在浏览器能同步刷新你的代码.webpack 热更新依赖 webpack-dev-server.具体实现步骤如下: 1.局部安装依赖 webpack-dev-server npm ins ...
- 我对Web开发的认识
前端 使用mvvm框架,每个视图维护自己的数据模型,更专注于视图模型及状态,在框架的帮助下规范视图与后端的交互及减轻工作量 我的选择是avalon.js 解耦前后端开发 自有资源独立管理,向后端开放资 ...