定义表结构:
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句柄。