Django学习手册 - ORM 多对多表

定义表结构:

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表

Django学习手册 - ORM 多对多表

host表

Django学习手册 - ORM 多对多表

hostadmin_host 表

Django学习手册 - ORM 多对多表

多表操作(正向查找 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")

单条查询 结果:

Django学习手册 - ORM 多对多表

查询所有 结果:

Django学习手册 - ORM 多对多表

小结:

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句柄。
上一篇:jmeter3.2 版本完美实现Load Test报表


下一篇:(转)Ehcache 整合Spring 使用页面、对象缓存