定义表结构:

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. tensor flow中summary用法总结

    对于用法的总结详细的参见博文https://www.cnblogs.com/lyc-seu/p/8647792.html

  2. log4net 开启内部调试

    大家都在用LOG4NET,但这是封装好的,在有时我们找不到原因时会想到是不是发生在里面,比如,配置好了日志记录到数据库(Mysql.Oracle.Sql Server)等,但就是记录不上,又找不到原因 ...

  3. Nginx入门篇-基础知识与linux下安装操作

    我们要深刻理解学习NG的原理与安装方法,要切合实际结合业务需求,应用场景进行灵活使用. 一.Nginx知识简述Nginx是一个高性能的HTTP服务器和反向代理服务器,也是一个 IMAP/POP3/SM ...

  4. Go-day02

    Go程序的基本结构 ***func init() 会在main函数之前执行 1.包中的函数调用 a.同一个包中函数,直接调用 b.不同包中函数,通过包名+点+函数名进行调用 2.包的访问控制规则 a. ...

  5. 洛谷P1073 Tarjan + 拓扑排序 // 构造分层图

    https://www.luogu.org/problemnew/show/P1073 C国有 n n个大城市和 mm 条道路,每条道路连接这 nn个城市中的某两个城市.任意两个城市之间最多只有一条道 ...

  6. jvm垃圾收集器与内存分配策略

    一.垃圾回收 1.对象是否已经变为垃圾 1.1.引用计数法:给对象添加一个引用计数器,每当有地方引用它时,计数器就加1:当引用失效时,计数器值就减1:任何时刻计数器为0的对象就是不可能再被使用的. 这 ...

  7. Linux记录-配置sudoers无密登录和环境变量

    su root vim /etc/sudoers.d/sfapp sfapp ALL=(ALL) ALLsfapp ALL=(ALL) NOPASSWD: ALL Defaults !env_rese ...

  8. Linux下常用配置文件

    /etc/sysconfig/network 包括主机基本网络信息,用于系统启动 /etc/sysconfig/network-script/ 此目录下是系统启动最初始化网络的信息 /etc/sysc ...

  9. IT术语

    目录: 心跳检测 故障切换 主从配置 负载均衡 集群LVS 多集群横向扩容 纵向扩容 CDN DOS DDOS 会话跟踪 CSRF

  10. sql 三表左外链接的2种写法【原】

    初始化语句 DROP TABLE student; ) )); ','bobo'); ','sisi'); ','gugu'); ','mimi'); DROP TABLE room; ) ),roo ...