定义表结构:

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句柄。

Django学习手册 - ORM 多对多表的更多相关文章

  1. Django学习手册 - ORM 数据创建/表操作 汇总

    ORM 查询的数据类型: QuerySet与惰性机制(可以看作是一个列表) 所谓惰性机制:表名.objects.all()或者.filter()等都只是返回了一个QuerySet(查询结果集对象),它 ...

  2. Django学习手册 - ORM数据类型

    DOM 字段/参数 配置格式: Module.字段(参数) 常用的字段归纳: 数字 models.AutoField() 自增列(int),必须设置为主键 models.IntegerField() ...

  3. Django学习手册 - ORM 单表数据获取

    Django 单表数据的获取: 先建立数据表格 from django.db import models # Create your models here. class userinfo(model ...

  4. django 学习手册 - ORM 报错集(随时更新)

    报错问题: 问题一:(1050代码) django.db.utils.InternalError: (1050, "Table 'app01_group' already exists&qu ...

  5. Django学习手册 - ORM 外键

    Django 外键创建 关键语法: models.ForeignKey("UserGroup",to_field="gid",default=1,on_dele ...

  6. Django学习手册 - ORM sqlit基础数据库操作

    步骤阐述:( splitDB 是Django自带的一个数据库) 1.在APP01 中的 models.py 配置DB信息  userinfo 相当于数据表的表名,而 uname.pwd 相当于 表中的 ...

  7. Django学习手册 - ORM - ImageField数据类型

    前置步骤 setting.py文件配置: 添加app目录 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'djan ...

  8. Django学习手册 - ORM choice字段 如何在页面上显示值

    在module操作过程中使用choice字段: 核心: obj.get_字段名_display 定义module 数据结构: class msg(models.Model): choice = ( ( ...

  9. Django 学习 之ORM聚合查询分组查询与F查询与Q查询

    一.聚合查询和分组查询 1.聚合查询aggregate 关于数据表的数据请见上一篇:Django 学习 之ORM多表操作(点我) aggregate(*args, **kwargs),只对一个组进行聚 ...

随机推荐

  1. 将Excel导出为SQL语句

    需求说明:公司做项目前进行需求分析,确定表结构后需要建表,如果照着表格去敲,那就太麻烦了,所以想到了自动生成SQL语句. 思路大概就是:解析Excel,拼接SQL语句,输出SQL文件. 第三方jar包 ...

  2. Doing Homework HDU - 1074 (状压dp)

    Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Every ...

  3. goto语句

    让程序直接跳到自定义标签位置 public static void Main(string[] args) { ; goto myLabel;AppDomainInitializer//直接跳到标签m ...

  4. HTML学习笔记Day16

    一.CSS 3D 1.什么是3d的场景呢? 2d场景,在屏幕上水平和垂直的交叉线x轴和y轴 3d场景,在垂直于屏幕的方法,相对于2d多出个z轴 Z轴:靠近屏幕的方向是正向,远离屏幕的方向是反向 2.C ...

  5. (栈)leetcode 946. Validate Stack Sequences

    Given two sequences pushed and popped with distinct values, return true if and only if this could ha ...

  6. 4.django学习模板

    ##引用模板 步骤: 在应用目录下创建templates目录,在目录下创建html文件 在views.py返回render(渲染) 1.requests请求本身,2.模板文件,3.后台传递到前端的数据 ...

  7. 友链——一群dalao

    ****敲黑板,重点. <机房最强大佬(楼下的CP)>https://deathmonkey.blog.luogu.org/ <机房最强基佬> https://www.luog ...

  8. Jz2440开发板熟悉

    title: Jz2440开发板熟悉 tags: ARM date: 2018-10-14 15:05:56 --- 概述 外部晶振为12M Nand Flash 256M,Nor Flash 2M, ...

  9. flask blueprint

    在使用flask进行一个项目编写的时候,可能会有许多个模块,如一个网站的前台(home)和后台(admin)模块,如果把这两个模块都放在一个views.py文件之中,那么最后views.py文件必然臃 ...

  10. Mybatis笔记二:接口式编程

    目录 旧方法的弊端 接口式编程 接口式编程的好处 接口式编程的增删改查 旧方法的弊端 在Mybatis笔记一中,我们使用命名空间+id的方式实现了Mybatis的执行,不过这里的命名空间是我们随便写的 ...