定义表结构:
class Host(models.Model):
hostname = models.CharField(max_length=32)
port = models.IntegerField() class HostAdmin(models.Model):
username = models.CharField(max_length=32)
email = models.CharField(max_length=32)
host = models.ManyToManyField(Host)
#这条语句输入以后,会自动创建一个表。这里自动创建的表名为 app01_hostadmini_host,也就是第三张截图的表。
添加数据:
hostadmin表
host表
hostadmin_host 表
多表操作(正向查找 hostadmin表 → host表):
def index(request):
# 添加/关联数据:
#(找到第一张表的一条数据,然后再找到第二张表的数据,然后关联)
# 方式一:
# #admin表的一条数据
# admin_obj = models.HostAdmin.objects.get(username='A1')
# #host表中的一条数据
# host_list = models.Host.objects.filter(id__lt=4)
# #通过admin多对host键add增加
# admin_obj.host.add(*host_list)
#第二张表的数据之间关联第一张表的数据 # 方式二:
# obj = models.HostAdmin.objects.filter(id=2)
# obj.host.add(2)
#单个
#或
# obj.host.add(3, 4)
#元组
#或
# obj.host.add(*[2,3,4,5])
#字典
#通过id进行关联,id=2的数据关联第二张表的id 2 ,id 3 ,id 4,id 5 # 删除数据
# obj.host.remove(1)
# obj.host.remove(2,3)
# obj.host.remove(*[1,2,3,4]) # 清除数据
# obj.host.clear() # 更新数据
# obj.set([3,4,5])
# 注意,这样配置了以后,就只剩3,4,5 数据条目了,其他都被清除了。 # 单条查询
# admin_obj = models.HostAdmin.objects.get(username='A1')
# # print(admin_obj.host.all())
# for i in admin_obj.host.all():
# print(i,i.hostname) #查询所有
# admin_all_obj = models.HostAdmin.objects.all()
# for i in admin_all_obj:
# print(i.username)
# print("-"*3)
# for i2 in i.host.all():
# print(i2.hostname)
# print("*"*10)
#i.host.all()也是obj对象,要取得其中的数据用嵌套for循环。 return HttpResponse("OK")
单条查询 结果:
查询所有 结果:
小结:
ORM多表操作,通过定义的 :host = models.ManyToManyField(Host),进行跨表操作。★★★★
反向查询:
# #反向关联
# #host表中的数据
# host_obj = models.Host.objects.get(id=3)
# #admin 表中的数据
# admin_list = models.HostAdmin.objects.filter(id__gt=3)
# #通过hostadmin_set 增加一条关联
# host_obj.hostadmin_set.add(*admin_list) # 反向查询
# 查询:
# host_obj = models.Host.objects.get(hostname="B2")
# print(host_obj.hostname)
# for i in host_obj.hostadmin_set.all():
# print(i.username) # 区别总结:区别在于正向查拥有自己创建好的host句柄,可以直接使用add方法添加,而反向查没有,所以要使用django为我们提供的set句柄。