day20-django 跨表查询的三种方式

一、引子

  续上回的操作,在跨表查询中,有3中方式, 注意跨表,  "." 和“__” 的区别

二、栗子

  后台,views

 1 def host(request):
 2     v1=models.Hostb.objects.filter(nid__gt=0)
 3     # for row in v1:
 4     #     print(row.nid,row.hostname,row.ip,row.port,row.b.id,row.b.caption,row.b.code)
 5         # print(row.b_id)
 6         # print(row.b.fk.name)
 7 
 8     #数据库 host表中存放的 是 b_id, 查询的时候是一个对象,通过. 获取关联表的数据
 9 
10     # “。” 能跨表,__  也能跨表,但是“。”在下面的方式中无法使用,用 双下画线
11 
12     v2=models.Hostb.objects.filter(nid__gt=0).values("nid","hostname","ip","port","b__caption")
13     # print(v2)
14     #query set
15 
16     # for row in v2:
17     #     print(row["nid"],row["hostname"],row["b__caption"])
18 
19 
20     v3=models.Hostb.objects.filter(nid__gt=0).values_list("nid","hostname","ip","port","b__caption")
21     print(v3)
22     return render(request,"host.html",{"v1":v1,"v2":v2,"v3":v3})

  前端

 1 <!DOCTYPE html>
 2 <html>
 3 <head lang="en">
 4     <meta charset="UTF-8">
 5     <title></title>
 6 </head>
 7 <body>
 8     <h1>主机列表 “.”跨表 字典</h1>
 9     <table border="1">
10         <thead>
11             <tr>
12                 <th>主机id</th>
13                 <th>主机名</th>
14                 <th>ip</th>
15                 <th>端口</th>
16                 <th>业务线id</th>
17                 <th>业务线名称</th>
18                 <th>业务线code</th>
19             </tr>
20         </thead>
21         <tbody>
22 
23                 {% for row in v1 %}
24                    <tr>
25                    <td>{{ row.nid }}</td>
26                    <td>{{ row.hostname }}</td>
27                    <td>{{ row.ip }}</td>
28                    <td>{{ row.port }}</td>
29                    <td>{{ row.b_id }}</td>
30                    <td>{{ row.b.caption }}</td>
31                    <td>{{ row.b.code }}</td>
32                    </tr>
33                 {% endfor %}
34 
35         </tbody>
36     </table>
37 
38 
39     <h1>主机列表  __跨表 列表</h1>
40     <table border="1">
41         <thead>
42             <tr>
43                 <th>主机id</th>
44                 <th>主机名</th>
45                 <th>ip</th>
46                 <th>端口</th>
47 
48                 <th>业务线名称</th>
49 
50             </tr>
51         </thead>
52         <tbody>
53 
54                 {% for row in v2 %}
55                    <tr>
56                    <td>{{ row.nid }}</td>
57                    <td>{{ row.hostname }}</td>
58                    <td>{{ row.ip }}</td>
59                    <td>{{ row.port }}</td>
60 
61                    <td>{{ row.caption }}</td>
62 
63                    </tr>
64                 {% endfor %}
65 
66         </tbody>
67     </table>
68 
69       <h1>主机列表  __跨表 元组</h1>
70     <table border="1">
71         <thead>
72             <tr>
73                 <th>主机id</th>
74                 <th>主机名</th>
75                 <th>ip</th>
76                 <th>端口</th>
77 
78                 <th>业务线名称</th>
79 
80             </tr>
81         </thead>
82         <tbody>
83 
84                 {% for row in v3 %}
85                    <tr>
86                    <td>{{ row.0 }}</td>
87                    <td>{{ row.1 }}</td>
88                    <td>{{ row.2 }}</td>
89                    <td>{{ row.3 }}</td>
90 
91                    <td>{{ row.4 }}</td>
92 
93                    </tr>
94                 {% endfor %}
95 
96         </tbody>
97     </table>
98 </body>
99 </html>

  结果:

  三、总结

    1. 通过外键的方式获取另外一张表中的字段值,一个是以对象的方式,一个是以字符串的方式
    2. 只要遇到 values,values_list的方式获取字符值,需要 外键名__字段名,比如:business__caption(business的是外键名,caption是Business的类中字段)
    3. 只要是querySet类型的,且是对象的,就需要  外键名.字段名    比如:business.caption(business的是外键名,caption是Business的类中字段)
posted @ 2018-07-20 13:28  东郭仔  阅读(215)  评论(0)    收藏  举报