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>
结果:

三、总结
- 通过外键的方式获取另外一张表中的字段值,一个是以对象的方式,一个是以字符串的方式
- 只要遇到 values,values_list的方式获取字符值,需要 外键名__字段名,比如:business__caption(business的是外键名,caption是Business的类中字段)
- 只要是querySet类型的,且是对象的,就需要 外键名.字段名 比如:business.caption(business的是外键名,caption是Business的类中字段)

浙公网安备 33010602011771号