django基础之day09,多对多创建数据表的三种方式
多对多三种创建方式
1.全自动(用在表关系不复杂的一般情况)
class Book(models.Model):
title=models.CharField(max_length=32)
多对多关系字段
authors=models.ManyToManyField(to='Authors')
class Authors(models.Model):
name=models.CharField(max_length=32)
全自动创建第三张关系表的好处:
至始至终都没有操作第三张表,全部都是由orm自动帮你创建的
还内置了四个操作第三张表的方法
add remove set clear
不足之处:
自动创建的第三张表无法扩展需要的字段,不支持修改,表的扩展性很差
(封装程度越高,可扩展性越低)
2.纯手撸三张表(了解)
class Book(models.Model):
title=models.CharField(max_length=32)
class Authors(models.Model):
name=models.CharField(max_length=32)
class Book2Authors(models.Model):
book=models.ForeignKey(to='Book')
author=models.ForeignKey(to='Authors')
create_time=models.DateField(auto_now_add=True)
好处:
第三张表中字段个数和字段名称全都可以自己来定义
不足之处:
不再支持orm跨表查询,没有正反向查询的概念
不支持add remove set clear
3.半自动(推荐使用)
class Authors(models.Model):
name=models.CharField(max_length=32)
class Book2Authors(models.Model):
book=models.ForeignKey(to='Book')
authors=models.ForeignKey(to='Authors')
class Book(models.Model):
title=models.CharField(max_length=32)
#多对多关系字段
authors=models.ManyToManyField(to='Authors',through='Book2Authors',through_fields=("book","authors"))
'''
1.当你的ManyToManyField只有一个参数的情况下,orm会自动帮你创建第三张关系表
2.如果你加了through='第三张关系表表名',
和through_fields=("关系表表字段1","关系表表字段2"),
,那么orm就不会自动帮你创建第三张表,但是它会在内部帮你维护表关系,让你能够继续使用orm的跨表查询
3.through_fields=("第三张关系表表字段1","第三张关系表表字段2")中字段放置上是有顺序的,
注意事项:
Book表中多对多关系字段,:
authors=models.ManyToManyField(to='Authors',through='Book2Authors',through_fields=("book","authors"))
through_fields【!!放在哪张表中,该表的表名就放在前面!!】
4.
through='第三张关系表表名',
through_fields=("第三张关系表表字段1","第三张关系表表字段2"),
'''
django基础之day09,多对多创建数据表的三种方式的更多相关文章
- Mysql 删除数据表的三种方式详解
用法: 1.当你不再需要该表时, 用 drop; 2.当你仍要保留该表,但要删除所有记录时, 用 truncate; 3.当你要删除部分记录或者有可能会后悔的话, 用 delete. 删除强度:dro ...
- iReport+jasperreport创建子表的几种方式(1)
在制作报表的过程中,子表是不可缺少的.今天就研究了一下制作子表的几种方式 一.连接数据库创建子表 以MySQL为例: 我的数据源数据库中的表 watermark/2/text/aHR0cDovL2Js ...
- java核心知识点学习----创建线程的第三种方式Callable和Future CompletionService
前面已经指出通过实现Runnable时,Thread类的作用就是将run()方法包装成线程执行体,那么是否可以直接把任意方法都包装成线程执行体呢?Java目前不行,但其模仿者C#中是可以的. Call ...
- Java反射机制(创建Class对象的三种方式)
1:了解什么是反射机制? 在通常情况下,如果有一个类,可以通过类创建对象:但是反射就是要求通过一个对象找到一个类的名称: 2:在反射操作中,握住一个核心概念: 一切操作都将使用Object完成,类 ...
- JDBC 创建连接对象的三种方式 、 properties文件的建立、编辑和信息获取
创建连接对象的三种方式 //第一种方式 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/ ...
- Java反射机制(创建Class对象的三种方式)
1:SUN提供的反射机制的类: java.lang.Class<T> java.lang.reflect.Constructor<T> java.lang.reflect.Fi ...
- java核心知识点----创建线程的第三种方式 Callable 和 Future CompletionService
前面已经指出通过实现Runnable时,Thread类的作用就是将run()方法包装成线程执行体,那么是否可以直接把任意方法都包装成线程执行体呢?Java目前不行,但其模仿者C#中是可以的. Call ...
- PHP中数据类型转换的三种方式
PHP中数据类型转换的三种方式 PHP的数据类型转换属于强制转换,允许转换的PHP数据类型有: 1.(int).(integer):转换成整形2.(float).(double).(real):转换成 ...
- spring中创建bean对象的三种方式以及作用范围
时间:2020/02/02 一.在spring的xml配置文件中创建bean对象的三种方式: 1.使用默认构造函数创建.在spring的配置文件中使用bean标签,配以id和class属性之后,且没有 ...
随机推荐
- centos7清理矿机木马qw3xT,kpgrbcc
腾讯云报告了root口令被暴力破解,并种了木马kpgrbcc 昨晚找到/usr/bin/ rm -rf kpgrbcc 删除 rm -rf kpgrbcb 删除 并ps -ef | grep kpg ...
- 新闻实时分析系统-inux环境准备与设置
1.Linux系统常规设置 1)设置ip地址 项目视频里面直接使用界面修改ip比较方便,如果Linux没有安装操作界面,需要使用命令:vi /etc/sysconfig/network-scripts ...
- java中的运算,+-* /% | ^ &
java中运算都是操作符号,那么整形默认为int,双精度默认为都double 整数 看案例: 无法编译通过:操作默认为int,接受结果为int,所以这个地方编译无法通过,所以需要强制类型转换 再看案例 ...
- es6 filter方法应用
let arr =[ {title:'aaaa',read:100,hot:true}, {title:'bbbb',read:50,hot:false}, {title:'ccc',read:100 ...
- 在centos7上进行hadoop-3.1.2的伪分布搭建
第一步:配置网络(静态IP) vi /etc/sysconfig/network-scripts/ifcfg-ens33(网卡名称可能不同) 1. 修改: 将该配置文件中的ONBOOT=no修改为ye ...
- Java基础常见笔试题总结
1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行的字节码文件 2.“sta ...
- 程序员的算法课(20)-常用的图算法:最小生成树(MST)
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/de ...
- 【Android - IPC】之ContentProvider简介
1.Content Provider简介 Content Provider是Android中提供的一种专门用于不同应用之间进行数据共享的方式,从这一点来看,它天生就适合IPC(Inter-Proces ...
- MySQL5.7.18自动化安装脚本
背景 很好的朋友邱启明同学,擅长MySQL,目前任职某大型互联网业MySQL DBA,要来一套MySQL自动安装的Shell脚本,贴出来保存一些. 此版本为 MySQL 5.7.18 ###### 自 ...
- php 开山篇
由韩顺平老师讲解的 php课程体系 初级课程只能是静态页面开发,不能动态的使用,只是一个界面 学完之后脑海中 应该有的体系~