一對多的表查詢
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<code>class</code> <code>Project(models.Model):</code>
<code> </code><code>name </code><code>=</code> <code>models.CharField(u</code><code>'項目名稱'</code><code>,max_length</code><code>=</code><code>32</code><code>,blank</code><code>=</code><code>True</code><code>)</code>
<code> </code><code>id</code> <code>=</code> <code>models.CharField(u</code><code>'項目ID'</code><code>,max_length</code><code>=</code><code>32</code><code>,unique</code><code>=</code><code>True</code><code>,primary_key</code><code>=</code><code>True</code><code>,blank</code><code>=</code><code>True</code><code>)</code>
<code> </code><code>create_date </code><code>=</code> <code>models.DateTimeField(u</code><code>'建立時間'</code><code>, auto_now_add</code><code>=</code><code>True</code><code>)</code>
<code> </code><code>update_date </code><code>=</code> <code>models.DateTimeField(u</code><code>'更新時間'</code><code>, auto_now</code><code>=</code><code>True</code><code>)</code>
<code> </code><code>def</code> <code>__unicode__(</code><code>self</code><code>):</code>
<code> </code><code>return</code> <code>self</code><code>.name</code>
<code> </code>
<code>class</code> <code>Uhost(models.Model):</code>
<code> </code><code>name </code><code>=</code> <code>models.CharField(u</code><code>'計算機名'</code><code>,max_length</code><code>=</code><code>32</code><code>,blank</code><code>=</code><code>False</code><code>)</code>
<code> </code><code>id</code> <code>=</code> <code>models.CharField(u</code><code>'執行個體ID'</code><code>,max_length</code><code>=</code><code>32</code><code>,blank</code><code>=</code><code>False</code><code>,primary_key</code><code>=</code><code>True</code><code>)</code>
<code> </code><code>ip </code><code>=</code> <code>models.GenericIPAddressField(u</code><code>'IP位址'</code><code>,blank</code><code>=</code><code>True</code><code>,null</code><code>=</code><code>True</code><code>)</code>
<code> </code><code>cpu </code><code>=</code> <code>models.CharField(u</code><code>'CPU/核'</code><code>,max_length</code><code>=</code><code>32</code><code>,blank</code><code>=</code><code>True</code><code>,null</code><code>=</code><code>True</code><code>)</code>
<code> </code><code>memory </code><code>=</code> <code>models.CharField(U</code><code>'記憶體/G'</code><code>,max_length</code><code>=</code><code>32</code><code>,blank</code><code>=</code><code>True</code><code>)</code>
<code> </code><code>state </code><code>=</code> <code>models.CharField(u</code><code>'執行個體狀态'</code><code>,max_length</code><code>=</code><code>32</code><code>,blank</code><code>=</code><code>True</code><code>)</code>
<code> </code><code>expiretime </code><code>=</code> <code>models.DateTimeField(u</code><code>'到期時間'</code><code>, max_length</code><code>=</code><code>50</code><code>, null</code><code>=</code><code>True</code><code>, blank</code><code>=</code><code>True</code><code>)</code>
<code> </code><code>isexpire </code><code>=</code> <code>models.CharField(u</code><code>'是否過期'</code><code>, max_length</code><code>=</code><code>20</code><code>, blank</code><code>=</code><code>True</code><code>)</code>
<code> </code><code>autorenew </code><code>=</code> <code>models.CharField(u</code><code>'自動續費'</code><code>, max_length</code><code>=</code><code>20</code><code>, blank</code><code>=</code><code>True</code><code>)</code>
<code> </code><code>tag </code><code>=</code> <code>models.CharField(u</code><code>'業務組'</code><code>,max_length</code><code>=</code><code>32</code><code>,blank</code><code>=</code><code>True</code><code>)</code>
<code> </code><code>networkstate </code><code>=</code> <code>models.CharField(u</code><code>'網絡狀态'</code><code>,max_length</code><code>=</code><code>32</code><code>,blank</code><code>=</code><code>True</code><code>)</code>
<code> </code><code>type</code> <code>=</code> <code>models.CharField(u</code><code>'執行個體類型'</code><code>,max_length</code><code>=</code><code>32</code><code>,blank</code><code>=</code><code>True</code><code>)</code>
<code> </code><code>osfamily </code><code>=</code> <code>models.CharField(u</code><code>'系統類型'</code><code>,max_length</code><code>=</code><code>32</code><code>,blank</code><code>=</code><code>True</code><code>)</code>
<code> </code><code>ostype </code><code>=</code> <code>models.CharField(u</code><code>'作業系統'</code><code>, max_length</code><code>=</code><code>50</code><code>, blank</code><code>=</code><code>True</code><code>)</code>
<code> </code><code>chargetype </code><code>=</code> <code>models.CharField(u</code><code>'付費類型'</code><code>, max_length</code><code>=</code><code>50</code><code>, blank</code><code>=</code><code>True</code><code>)</code>
<code> </code><code>datadisk </code><code>=</code> <code>models.IntegerField(u</code><code>'資料盤/G'</code><code>, blank</code><code>=</code><code>True</code><code>)</code>
<code> </code><code>price </code><code>=</code> <code>models.DecimalField(u</code><code>'價格'</code><code>,max_digits</code><code>=</code><code>8</code><code>,decimal_places</code><code>=</code><code>2</code><code>,null</code><code>=</code><code>True</code><code>,blank</code><code>=</code><code>True</code><code>)</code>
<code> </code><code>zone </code><code>=</code> <code>models.ForeignKey(Zone,verbose_name</code><code>=</code><code>u</code><code>'可用區'</code><code>,db_constraint</code><code>=</code><code>False</code><code>,on_delete</code><code>=</code><code>models.DO_NOTHING,blank</code><code>=</code><code>True</code><code>)</code>
<code> </code><code>project </code><code>=</code> <code>models.ForeignKey(Project,verbose_name</code><code>=</code><code>u</code><code>'所屬項目'</code><code>,db_constraint</code><code>=</code><code>False</code><code>,on_delete</code><code>=</code><code>models.DO_NOTHING,blank</code><code>=</code><code>True</code><code>)</code>
我建了兩張表,project和uhost。
其中uhost表的project字段是設定了ForeignKey。
先看下project表中的内容。
<code>>>> Project.objects.</code><code>all</code><code>()</code>
<code>[<Project: 上海别樣紅資訊技術有限公司>, <Project: 備案專用>, <Project: gitlab>, </code>
<code><Project: PublicTest>, <Project: SPMS>, <Project: 安全測試>, <Project: OTA>, </code>
<code><Project: </code><code>99</code><code>資料同步中轉,本項目與</code><code>99</code><code>内網打通,不允許添加任何機器>, <Project: Ops>,</code>
<code> </code><code><Project: iPms>]</code>
<code>>>> Project.objects.</code><code>all</code><code>().values(</code><code>'id'</code><code>)</code>
<code>[{</code><code>'id'</code><code>: u</code><code>'org-81'</code><code>}, {</code><code>'id'</code><code>: u</code><code>'org-aws3dj'</code><code>}, {</code><code>'id'</code><code>: u</code><code>'org-et55qg'</code><code>}, </code>
<code>{</code><code>'id'</code><code>: u</code><code>'org-ghan2t'</code><code>}, {</code><code>'id'</code><code>: u</code><code>'org-ja1wvv'</code><code>}, {</code><code>'id'</code><code>: u</code><code>'org-kbxrx4'</code><code>}, </code>
<code>{</code><code>'id'</code><code>: u</code><code>'org-pni2a2'</code><code>}, {</code><code>'id'</code><code>: u</code><code>'org-qf4d2n'</code><code>}, {</code><code>'id'</code><code>: u</code><code>'org-vzfixt'</code><code>}, </code>
<code>{</code><code>'id'</code><code>: u</code><code>'org-wrg10n'</code><code>}]</code>
表查詢:
查詢uhost表中name中包含OPS10的所有主機對象
<code>>>> Uhost.objects.</code><code>filter</code><code>(name__contains</code><code>=</code><code>'OPS10'</code><code>)</code>
<code>[<Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>CS05>, <Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>SPPX01>, <Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>MAIL01>, </code>
<code><Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>PROXY02>, <Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>PROXY01>, <Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>HAP02>,</code>
<code> </code><code><Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>HAP01>, <Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>ANSIBLE02>, <Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>NGX01>, </code>
<code> </code><code><Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>NGX02>, <Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>PROXY05>, <Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>ANSIBLE06>, </code>
<code> </code><code><Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>DEPLOY01>, <Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>NGINX01>, <Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>ES02>, </code>
<code> </code><code><Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>ES03>, <Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>ES01>, <Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>LOGSTASH01>, </code>
<code> </code><code><Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>PROXY04>, <Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>PROXY03>, </code><code>'...(remaining elements truncated)...'</code><code>]</code>
正向查詢:
若關系模型A包含與模型B關聯的關聯字段, 模型A的執行個體可以通過關聯字段通路與其關聯的模型B的執行個體:
Django提供了一種使用雙下劃線<code>__</code>的查詢文法:
例如:
<code>Uhost.objects.</code><code>filter</code><code>(project__id</code><code>=</code><code>'org-81'</code><code>)</code>
查找uhost表中,所有project id為‘org-81’的的主機
<code>>>> Uhost.objects.</code><code>filter</code><code>(project__id</code><code>=</code><code>'org-81'</code><code>)</code>
<code>[<Uhost: dbbackupsyncer2>, <Uhost: SRV</code><code>-</code><code>CPMS10</code><code>-</code><code>WEB16>, <Uhost: SRV</code><code>-</code><code>CPMS10</code><code>-</code><code>WEB15>, </code>
<code><Uhost: publicconsole>, <Uhost: SRV</code><code>-</code><code>CPMS10</code><code>-</code><code>WEB14>, <Uhost: dbbackupsyncer>,</code>
<code><Uhost: 官網>, <Uhost: </code><code>99exchangedb</code><code>>, <Uhost: dc1>, <Uhost: dc2>, <Uhost: publicweb>, </code>
<code><Uhost: SRV</code><code>-</code><code>CPMS10</code><code>-</code><code>WEB13>, <Uhost: SRV</code><code>-</code><code>OTA10</code><code>-</code><code>WS04>, <Uhost: SRV</code><code>-</code><code>OTA10</code><code>-</code><code>WS05>, </code>
<code><Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>CS05>, <Uhost: SRV</code><code>-</code><code>OTA10</code><code>-</code><code>WS03>, <Uhost: SRV</code><code>-</code><code>OTA10</code><code>-</code><code>WEB04>, </code>
<code><Uhost: SRV</code><code>-</code><code>OTA10</code><code>-</code><code>WEB03>, <Uhost: </code><code>99datasyncer</code><code>>, <Uhost: SRV</code><code>-</code><code>CPMS10</code><code>-</code><code>WEB31>, </code><code>'...(remaining elements truncated)...'</code><code>]</code>
查詢uhost表中project id包含‘ghan’的主機資訊
<code>>>> Uhost.objects.</code><code>filter</code><code>(project__id__contains</code><code>=</code><code>'ghan'</code><code>)</code>
<code>[<Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>ANSIBLE06>, <Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>DEPLOY01>, \</code>
<code><Uhost: SRV</code><code>-</code><code>OPS01</code><code>-</code><code>DEPLOY01>, <Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>NGINX01>, \</code>
<code><Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>ES02>, <Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>ES03>, <Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>ES01>,\</code>
<code><Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>LOGSTASH01>]</code>
反向查詢:
被索引的關系模型可以通路所有參照它的模型的執行個體,如Entry.blog作為Blog的外鍵,預設情況下Blog.entry_set是包含所有參照Blog的Entry示例的查詢集,可以使用查詢集API取出相應的執行個體。
查詢project name為Ops的所有主機對象
<code>>>> Project.objects.get(name</code><code>=</code><code>'Ops'</code><code>).uhost_set.</code><code>all</code><code>()</code>
<code>[<Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>ANSIBLE06>, <Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>DEPLOY01>,</code>
<code><Uhost: SRV</code><code>-</code><code>OPS01</code><code>-</code><code>DEPLOY01>, <Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>NGINX01>, </code>
<code><Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>ES02>, <Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>ES03>, <Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>ES01>, </code>
查詢project name為Ops的所有主機對象的name屬性
<code>>>> Project.objects.get(name</code><code>=</code><code>'Ops'</code><code>).uhost_set.values(</code><code>'name'</code><code>)</code>
<code>[{</code><code>'name'</code><code>: u</code><code>'SRV-OPS10-ANSIBLE06'</code><code>}, {</code><code>'name'</code><code>: u</code><code>'SRV-OPS10-DEPLOY01'</code><code>}, \</code>
<code>{</code><code>'name'</code><code>: u</code><code>'SRV-OPS01-DEPLOY01'</code><code>}, {</code><code>'name'</code><code>: u</code><code>'SRV-OPS10-NGINX01'</code><code>}, \</code>
<code>{</code><code>'name'</code><code>: u</code><code>'SRV-OPS10-ES02'</code><code>}, {</code><code>'name'</code><code>: u</code><code>'SRV-OPS10-ES03'</code><code>}, \</code>
<code>{</code><code>'name'</code><code>: u</code><code>'SRV-OPS10-ES01'</code><code>}, {</code><code>'name'</code><code>: u</code><code>'SRV-OPS10-LOGSTASH01'</code><code>}]</code>
查詢project name為Ops的,并且name包含OPS字元串的所有主機
<code>>>> Project.objects.get(name</code><code>=</code><code>'Ops'</code><code>).uhost_set.</code><code>filter</code><code>(name__contains</code><code>=</code><code>'OPS'</code><code>)</code>
<code>[<Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>ANSIBLE06>, <Uhost: SRV</code><code>-</code><code>OPS10</code><code>-</code><code>DEPLOY01>, </code>
一對多表建立對象:
<code>>>> host</code><code>=</code><code>Uhost(</code><code>id</code><code>=</code><code>'aaaaa'</code><code>)</code>
<code>>>> host.project</code><code>=</code><code>Project.objects.get(</code><code>id</code><code>=</code><code>'org-81'</code><code>)</code>
<code>>>> host</code><code>=</code><code>Uhost(name</code><code>=</code><code>'SRV-TEST'</code><code>)</code>
<code>>>> host.save()</code>
多對多的查詢
示例:
<code>class</code> <code>GroupInfo(models.Model):</code>
<code> </code><code>name </code><code>=</code> <code>models.CharField(U</code><code>'組名'</code><code>,max_length</code><code>=</code><code>32</code><code>,blank</code><code>=</code><code>True</code><code>)</code>
<code>class</code> <code>UserInfo(models.Model):</code>
<code> </code><code>name </code><code>=</code> <code>models.CharField(u</code><code>'姓名'</code><code>,max_length</code><code>=</code><code>32</code><code>,blank</code><code>=</code><code>True</code><code>)</code>
<code> </code><code>email </code><code>=</code> <code>models.EmailField(u</code><code>'郵箱'</code><code>)</code>
<code> </code><code>group </code><code>=</code> <code>models.ManyToManyField(GroupInfo)</code>
<a href="https://s5.51cto.com/wyfs02/M01/8E/9A/wKiom1jGdRehFUyoAAGnqu-0Nns885.png" target="_blank"></a>
<a href="https://s5.51cto.com/wyfs02/M02/8E/A2/wKioL1jHl0Wh-ai7AABc2BMow3M250.png" target="_blank"></a>
<a href="https://s3.51cto.com/wyfs02/M01/8E/A4/wKiom1jHl0bCyrzrAABtjlsZJro099.png" target="_blank"></a>
查詢:
從userinfo表開始查
<code>>>> UserInfo.objects.get(name</code><code>=</code><code>'zeng'</code><code>).group.</code><code>all</code><code>()</code>
<code>[<GroupInfo: 運維組>, <GroupInfo: 報警組>]</code>
<code>>>> UserInfo.objects.get(name</code><code>=</code><code>'zeng'</code><code>).group.</code><code>filter</code><code>(name</code><code>=</code><code>'運維組'</code><code>)</code>
<code>[<GroupInfo: 運維組>]</code>
從groupinfo表開始查
<code>>>> GroupInfo.objects.get(name</code><code>=</code><code>'CTO'</code><code>).userinfo_set.</code><code>all</code><code>()</code>
<code>[<UserInfo: zhang>]</code>
<code>>>> GroupInfo.objects.get(name</code><code>=</code><code>'CTO'</code><code>).userinfo_set.values(</code><code>'name'</code><code>,</code><code>'email'</code><code>)</code>
<code>[{</code><code>'name'</code><code>: u</code><code>'zhang'</code><code>, </code><code>'email'</code><code>: u</code><code>'[email protected]'</code><code>}]</code>
多對多表 建立對象:
<code>>>> u </code><code>=</code> <code>UserInfo(name</code><code>=</code><code>'he'</code><code>,email</code><code>=</code><code>'[email protected]'</code><code>)</code>
<code>>>> u.save()</code>
<code>>>> u.group.add(GroupInfo.objects.get(name</code><code>=</code><code>'運維組'</code><code>))</code>
注意:
要添加新對象時,首先必須保證該對象在做ManyToMany的兩張表中存在才行,比如上面的例子,我想建立一個叫he的使用者,組為運維組。但是he這個使用者不存在,是以先必須建立he這個對象,才能給他添加到運維組。
<a href="https://s1.51cto.com/wyfs02/M02/8E/A4/wKiom1jHoKawe8KfAAChgqWrYyk912.png" target="_blank"></a>
本文轉自 曾哥最愛 51CTO部落格,原文連結:http://blog.51cto.com/zengestudy/1906221,如需轉載請自行聯系原作者