django 表查询

一、一对多的表查询

class Project(models.Model):
    name = models.CharField(u‘项目名称‘,max_length=32,blank=True)
    id = models.CharField(u‘项目ID‘,max_length=32,unique=True,primary_key=True,blank=True)
    create_date = models.DateTimeField(u‘创建时间‘, auto_now_add=True)
    update_date = models.DateTimeField(u‘更新时间‘, auto_now=True)
    def __unicode__(self):
        return self.name
        
class Uhost(models.Model):
    name = models.CharField(u‘计算机名‘,max_length=32,blank=False)
    id = models.CharField(u‘实例ID‘,max_length=32,blank=False,primary_key=True)
    ip = models.GenericIPAddressField(u‘IP地址‘,blank=True,null=True)
    cpu = models.CharField(u‘CPU/核‘,max_length=32,blank=True,null=True)
    memory = models.CharField(U‘内存/G‘,max_length=32,blank=True)
    state = models.CharField(u‘实例状态‘,max_length=32,blank=True)
    expiretime = models.DateTimeField(u‘到期时间‘, max_length=50, null=True, blank=True)
    isexpire = models.CharField(u‘是否过期‘, max_length=20, blank=True)
    autorenew = models.CharField(u‘自动续费‘, max_length=20, blank=True)
    tag = models.CharField(u‘业务组‘,max_length=32,blank=True)
    networkstate = models.CharField(u‘网络状态‘,max_length=32,blank=True)
    type = models.CharField(u‘实例类型‘,max_length=32,blank=True)
    osfamily = models.CharField(u‘系统类型‘,max_length=32,blank=True)
    ostype = models.CharField(u‘操作系统‘, max_length=50, blank=True)
    chargetype = models.CharField(u‘付费类型‘, max_length=50, blank=True)
    datadisk = models.IntegerField(u‘数据盘/G‘, blank=True)
    price = models.DecimalField(u‘价格‘,max_digits=8,decimal_places=2,null=True,blank=True)
    zone = models.ForeignKey(Zone,verbose_name=u‘可用区‘,db_constraint=False,on_delete=models.DO_NOTHING,blank=True)
    project = models.ForeignKey(Project,verbose_name=u‘所属项目‘,db_constraint=False,on_delete=models.DO_NOTHING,blank=True)
    create_date = models.DateTimeField(u‘创建时间‘, auto_now_add=True)
    update_date = models.DateTimeField(u‘更新时间‘, auto_now=True)
    def __unicode__(self):
        return self.name

我建了两张表,project和uhost。

其中uhost表的project字段是设置了ForeignKey。

先看下project表中的内容。

>>> Project.objects.all()
[<Project: 上海别样红信息技术有限公司>, <Project: 备案专用>, <Project: gitlab>, 
<Project: PublicTest>, <Project: SPMS>, <Project: 安全测试>, <Project: OTA>, 
<Project: 99数据同步中转,本项目与99内网打通,不允许添加任何机器>, <Project: Ops>,
 <Project: iPms>]

>>> Project.objects.all().values(‘id‘)
[{‘id‘: u‘org-81‘}, {‘id‘: u‘org-aws3dj‘}, {‘id‘: u‘org-et55qg‘}, 
{‘id‘: u‘org-ghan2t‘}, {‘id‘: u‘org-ja1wvv‘}, {‘id‘: u‘org-kbxrx4‘}, 
{‘id‘: u‘org-pni2a2‘}, {‘id‘: u‘org-qf4d2n‘}, {‘id‘: u‘org-vzfixt‘}, 
{‘id‘: u‘org-wrg10n‘}]

表查询:

查询uhost表中name中包含OPS10的所有主机对象

>>> Uhost.objects.filter(name__contains=‘OPS10‘)
[<Uhost: SRV-OPS10-CS05>, <Uhost: SRV-OPS10-SPPX01>, <Uhost: SRV-OPS10-MAIL01>, 
<Uhost: SRV-OPS10-PROXY02>, <Uhost: SRV-OPS10-PROXY01>, <Uhost: SRV-OPS10-HAP02>,
 <Uhost: SRV-OPS10-HAP01>, <Uhost: SRV-OPS10-ANSIBLE02>, <Uhost: SRV-OPS10-NGX01>, 
 <Uhost: SRV-OPS10-NGX02>, <Uhost: SRV-OPS10-PROXY05>, <Uhost: SRV-OPS10-ANSIBLE06>, 
 <Uhost: SRV-OPS10-DEPLOY01>, <Uhost: SRV-OPS10-NGINX01>, <Uhost: SRV-OPS10-ES02>, 
 <Uhost: SRV-OPS10-ES03>, <Uhost: SRV-OPS10-ES01>, <Uhost: SRV-OPS10-LOGSTASH01>, 
 <Uhost: SRV-OPS10-PROXY04>, <Uhost: SRV-OPS10-PROXY03>, ‘...(remaining elements truncated)...‘]

正向查询:

若关系模型A包含与模型B关联的关联字段, 模型A的实例可以通过关联字段访问与其关联的模型B的实例:

Django提供了一种使用双下划线__的查询语法:

例如:

Uhost.objects.filter(project__id=‘org-81‘)

查找uhost表中,所有project id为org-81’的的主机

>>> Uhost.objects.filter(project__id=‘org-81‘)
[<Uhost: dbbackupsyncer2>, <Uhost: SRV-CPMS10-WEB16>, <Uhost: SRV-CPMS10-WEB15>, 
<Uhost: publicconsole>, <Uhost: SRV-CPMS10-WEB14>, <Uhost: dbbackupsyncer>,
<Uhost: 官网>, <Uhost: 99exchangedb>, <Uhost: dc1>, <Uhost: dc2>, <Uhost: publicweb>, 
<Uhost: SRV-CPMS10-WEB13>, <Uhost: SRV-OTA10-WS04>, <Uhost: SRV-OTA10-WS05>, 
<Uhost: SRV-OPS10-CS05>, <Uhost: SRV-OTA10-WS03>, <Uhost: SRV-OTA10-WEB04>, 
<Uhost: SRV-OTA10-WEB03>, <Uhost: 99datasyncer>, <Uhost: SRV-CPMS10-WEB31>, ‘...(remaining elements truncated)...‘]

查询uhost表中project id包含‘ghan’的主机信息

>>> Uhost.objects.filter(project__id__contains=‘ghan‘)
[<Uhost: SRV-OPS10-ANSIBLE06>, <Uhost: SRV-OPS10-DEPLOY01>, <Uhost: SRV-OPS01-DEPLOY01>, <Uhost: SRV-OPS10-NGINX01>, <Uhost: SRV-OPS10-ES02>, <Uhost: SRV-OPS10-ES03>, <Uhost: SRV-OPS10-ES01>,<Uhost: SRV-OPS10-LOGSTASH01>]

反向查询:

被索引的关系模型可以访问所有参照它的模型的实例,如Entry.blog作为Blog的外键,默认情况下Blog.entry_set是包含所有参照Blog的Entry示例的查询集,可以使用查询集API取出相应的实例。

查询project name为Ops的所有主机对象

>>> Project.objects.get(name=‘Ops‘).uhost_set.all()
[<Uhost: SRV-OPS10-ANSIBLE06>, <Uhost: SRV-OPS10-DEPLOY01>,
<Uhost: SRV-OPS01-DEPLOY01>, <Uhost: SRV-OPS10-NGINX01>, 
<Uhost: SRV-OPS10-ES02>, <Uhost: SRV-OPS10-ES03>, <Uhost: SRV-OPS10-ES01>, 
<Uhost: SRV-OPS10-LOGSTASH01>]

查询project name为Ops的所有主机对象的name属性

>>> Project.objects.get(name=‘Ops‘).uhost_set.values(‘name‘)
[{‘name‘: u‘SRV-OPS10-ANSIBLE06‘}, {‘name‘: u‘SRV-OPS10-DEPLOY01‘}, {‘name‘: u‘SRV-OPS01-DEPLOY01‘}, {‘name‘: u‘SRV-OPS10-NGINX01‘}, {‘name‘: u‘SRV-OPS10-ES02‘}, {‘name‘: u‘SRV-OPS10-ES03‘}, {‘name‘: u‘SRV-OPS10-ES01‘}, {‘name‘: u‘SRV-OPS10-LOGSTASH01‘}]

查询project name为Ops的,并且name包含OPS字符串的所有主机

>>> Project.objects.get(name=‘Ops‘).uhost_set.filter(name__contains=‘OPS‘)
[<Uhost: SRV-OPS10-ANSIBLE06>, <Uhost: SRV-OPS10-DEPLOY01>, 
<Uhost: SRV-OPS01-DEPLOY01>, <Uhost: SRV-OPS10-NGINX01>, 
<Uhost: SRV-OPS10-ES02>, <Uhost: SRV-OPS10-ES03>, <Uhost: SRV-OPS10-ES01>, 
<Uhost: SRV-OPS10-LOGSTASH01>]

时间: 2024-10-24 02:28:36

django 表查询的相关文章

django orm 关联表查询

django orm 关联表数据,即sql的多表查询 例如两个表: Apply表中定义了字段position为foreignkey指向job表的id字段, 1.通过job表查找子表apply的字段信息: job.objects.values( 'id', 'job_type', 'apply__date_created') 连接符为小写的子表tablename+双下线+子表字段名即:apply__date_created 表示寻找Apply表中的date_created字段 等价于后台的SQL:

Django 跨表查询--神奇的双下划线和点

我在django的moles中创建了两个calss,如下: class Project(models.Model):     name = models.CharField(u'项目名称',max_length=32,blank=True)     id = models.CharField(u'项目ID',max_length=32,unique=True,primary_key=True,blank=True)     create_date = models.DateTimeField(u

Django之跨表查询及添加记录

一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many);     一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系(one-to-many). 创建一对一的关系:OneToOne("要绑定关系的表名") 创建一对多的关系:ForeignKey("要绑定关系的表名") 创建多对多的关系:ManyToMany("要绑定关系的表名"

Django开发之路 二(django的models表查询)

django的models表查询 一.单表查询 (1) all(): 查询所有结果 # 返回的QuerySet类型 (2) filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 #返回的QuerySet类型 (3) get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个, #返回的models对象 如果符合筛选条件的对象超过一个或者没有都会抛出错误. (4) exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象 #返回的Query

django之多表查询与创建

https://www.cnblogs.com/liuqingzheng/articles/9499252.html # 一对多新增数据 添加一本北京出版社出版的书 第一种方式 ret=Book.objects.create(name='红楼梦',price=34.5,publish_id=1) print(ret.name) 第二种方式,存对象publish=出版社的对象,存到数据库,是一个id publish=Publish.objects.get(id=1) pk是主键,通过主键查找 pu

django之数据库表的单表查询

一.添加表记录 对于单表有两种方式 # 添加数据的两种方式 # 方式一:实例化对象就是一条表记录 Frank_obj = models.Student(name ="海东",course="python",birth="2000-9-9",fenshu=80) Frank_obj.save() # 方式二: models.Student.objects.create(name ="海燕",course="python

Django ORM queryset object 解释(子查询和join连表查询的结果)

#下面两种是基于QuerySet查询 也就是说SQL中用的jion连表的方式查询books = models.UserInfo.objects.all() print(type(books)) ---> <class 'django.db.models.query.QuerySet'> 查询出来是一个对象QuerySey 取值 print(books.values()) books = models.UserInfo.objects.filter()print(type(books))

Django Mysql数据库-基于双下划线的跨表查询

一.基于双下划线的跨表查询 Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系.要做跨关系查询,就使用两个下划线来链接模型(model)间关联字段的名称,直到最终链接到你想要的 model 为止.(相当于用sql语句用join连接的方式,可以在settings里面设置,可查看sql语句) 数据库模型: class Book(models.Model): nid = models.AutoField(primary_key=Tru

django中的跨表查询梳理

1.前言 最近在写一个小项目,里面主要涉及的就是表与表之间复杂的关系.当真正开发起来的时候,才发现自己对复杂的表关系间的查询有点混乱,趁着这几天的时间,重新梳理了一下. 2.概念 在开始之前,先明确几个基础概念: 正向查询:关联字段所在的表查询其关联表叫正向查询 反向查询:未写关联字段的表查询其关联表叫反向查询 # 书籍表 class Book(models.Model): name = models.CharField(max_length=32) publish = models.Forei