前言
上一篇文章中记录了如何获取数据表中的数据,但是只是获取单一表中的数据,对于一对多跨表操作我门又该如何实现呢?
一.定义数据表
我们定义一个一对多的数据表结构models.py:
from django.db import models
# Create your models here.
#
class Host(models.Model):
nid = models.AutoField(primary_key=True)
hostname = models.CharField(max_length=32,db_index=True)
ip = models.GenericIPAddressField(db_index=True)
port = models.IntegerField()
b = models.ForeignKey("Business",to_field='id',on_delete='')
class Business(models.Model):
# 默认有个自增的id列,并且是主键
caption = models.CharField(max_length=32)
code = models.CharField(max_length=32,default='sa')
执行数据库操作命令:
python manager.py makemigrations
python manager,py migrate
创建两个表:app01_host,app01_business,然后插入一些数据:
mysql> select * from app01_host;
+-----+----------+---------+------+------+
| nid | hostname | ip | port | b_id |
+-----+----------+---------+------+------+
| 1 | c1.com | 1.1.1.1 | 80 | 1 |
| 2 | c2.com | 1.1.1.2 | 90 | 1 |
| 3 | c3.com | 1.1.1.3 | 70 | 2 |
| 4 | c4.com | 1.1.1.4 | 60 | 2 |
| 5 | c4.com | 1.1.1.5 | 50 | 3 |
| 6 | c5.com | 1.1.1.5 | 50 | 2 |
+-----+----------+---------+------+------+
6 rows in set (0.00 sec)
mysql> select * from app01_business;
+----+-----------+------+
| id | caption | code |
+----+-----------+------+
| 1 | 开发部 | sa |
| 2 | 测试 | sa |
| 3 | 运维 | sa |
+----+-----------+------+
3 rows in set (0.00 sec)
二.一对多获取数据
1.以对象方式:
v1 = models.Host.objects.filter(nid__gt=0)
for row in v1:
print(row.nid,row.hostname,row.ip,row.port,row.b,row.b.id,row.b.caption,row.b.code)
这里需要注意的是:
- row.nid,row.hostname,row.ip,row.port都是值,但是row.b是一个对象,里边的数据是host中的数据,要想取host里的数据,需要:row.b.id,row.b.caption,row.b.code.
2.以字典方式
v2 = models.Host.objects.filter(nid__gt=0).values('nid','hostname','b_id','b__caption')
3.以元组方式
v3 = models.Host.objects.filter(nid__gt=0).values_list('nid','hostname','b_id','b__caption')
写在最后
本文是个人的一些学习笔记,如有侵权,请及时联系我进行删除,谢谢大家.