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即可找到)

posted @ 2017-01-12 15:10  温柔易淡  阅读(1302)  评论(0编辑  收藏  举报