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

  • 相关阅读:
    [Flex] Flex 控件&类 的自定义事件添加
    [java]原始类型和其包装类
    [java]解析网络上的xml文件
    [android]用adb操作android模拟器
    [java]优先队列
    [Q&A]为什么在ospf邻居之间确定主从关系?
    [js]jQuery插件开发总结
    [Q&A] 为什么把js脚本放到html页面的底部?
    理解一个简单的网页请求过程
    [js]如何更快的得到图片的高度和宽度
  • 原文地址:https://www.cnblogs.com/liaojiafa/p/6278343.html
Copyright © 2020-2023  润新知