模型如下:

class Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.URLField() class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField() class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField()

查看生成sql用>python manage.py sqlmigrate,

生成sql:

BEGIN;
--下面来解释自动生成的sql语句,生成的sql顺序比较乱,已经整理了一下 CREATE TABLE `posts_author` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`first_name` varchar(30) NOT NULL,
`last_name` varchar(40) NOT NULL,
`email` varchar(254) NOT NULL);
--
--
-- CREATE TABLE `posts_book` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`title` varchar(100) NOT NULL,
`publication_date` date NOT NULL);
--
CREATE TABLE `posts_book_authors` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`book_id` integer NOT NULL,
`author_id` integer NOT NULL);
--
-- 这个表是没有在models中定义的,只是因为authors = models.ManyToManyField(Author)
-- django就创建了一个表(多对多连接表)来处理书籍和作者之间的映射关系
--这也是数据库设计的原则,这样能较少冗余。不然的话,比如说一本书有多个作者,这个表就会重复多条数据(除了作者不同)
--
CREATE TABLE `posts_publisher` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`name` varchar(30) NOT NULL,
`address` varchar(50) NOT NULL,
`city` varchar(60) NOT NULL,
`state_province` varchar(30) NOT NULL,
`country` varchar(50) NOT NULL,
`website` varchar(200) NOT NULL);
--
-- 上面分别创建的表,因为模型没有指明关键字,所以自动创建id为关键字
--
ALTER TABLE `posts_book` ADD COLUMN `publisher_id` integer NOT NULL;
ALTER TABLE `posts_book` ALTER COLUMN `publisher_id` DROP DEFAULT;
ALTER TABLE `posts_book` ADD CONSTRAINT `posts_book_publisher_id_4475e105_fk_posts_publisher_id` FOREIGN KEY (`publisher_id`) REFERENCES `posts_publisher` (`id`);
--
-- publisher = models.ForeignKey(Publisher)
-- 这句话的意思是‘参考类Publisher(也就是表posts_publisher)’
-- 创建外键,表Publisher主键是id,所以会自动加上一个字段publisher_id
-- 最后就是在表posts_book 中增加外键 `posts_publisher` (`id`)
--
ALTER TABLE `posts_book_authors` ADD CONSTRAINT `posts_book_authors_book_id_1487a223_fk_posts_book_id` FOREIGN KEY (`book_id`) REFERENCES `posts_book` (`id`);
ALTER TABLE `posts_book_authors` ADD CONSTRAINT `posts_book_authors_author_id_0a9b3d34_fk_posts_author_id` FOREIGN KEY (`author_id`) REFERENCES `posts_author` (`id`);
ALTER TABLE `posts_book_authors` ADD CONSTRAINT `posts_book_authors_book_id_7d4dbc86_uniq` UNIQUE (`book_id`, `author_id`);
--
-- 这里又创建了两个外键,都是中间表‘外键’其他两个表,分别是
-- 表posts_book_authors(book_id) 外键 posts_book(id)
-- 表posts_book_authors(author_id) 外键 posts_author(id)
-- 最后做了唯一性约束
--
CREATE INDEX `posts_book_2604cbea` ON `posts_book` (`publisher_id`);
--
--可以看出,都是表创建完成后,才进行外键设置操作
--
COMMIT;

django 模型生成sql(多对多)的更多相关文章

  1. MySQL Workbench将模型生成SQL文件出错

    采用MySQL Workbench 设计好表和表关系后,从 File | Export 菜单中,选择 Forward Engineer SQL CREATE Script(正向引擎), 将我们的模型生 ...

  2. Quick BI 的模型设计与生成SQL原理剖析

    一.摘要 随着物联网的告诉发展,数据量呈现井喷式的增长,如何来分析和使用这些数据,使数据产生商业价值,已经变得越来越重要.值得高兴的是,当前越来越多的人已经意识到了用数据分析决定商业策略的重要性,也都 ...

  3. Django的Many-to-Many(多对多)模型

      Django的Many-to-Many(多对多)模型 日期:2012-05-05 |  来源:未知 |  作者:redice |  人围观 |  1 人鼓掌了! 鲲鹏Web数据抓取 - 专业Web ...

  4. PD 15.1 安装 破解 , 简单使用 (一对多,多对多关系生成sql脚本) , CDM 和 PDM 的区别;PD15.1 生成sql2008 无FK外键约束的解决方法

    CDM是概念模型,在概念模型上没有具体数据库产品的概念,反映的是实体和联系.PDM是物理模型,是依赖具体数据库产品的模型,比如可以指定具体的数据类型和约束等等.在PowerDesigner中两个模型之 ...

  5. django一对多、多对多模型、自关联的建立

    # 原创,转载请留言联系 一对多模型 一对多的关系,例如员工跟部门.一个部门有多个员工.那么在django怎么建立这种表关系呢? 其实就是利用外键,在多的一方,字段指定外键即可.例如员工和部门,员工是 ...

  6. django 有model生成SQL以及现有反向表生成model

    已有models生成SQL语句 语法 python manage.py sqlall app_name   # app_name, 在settings已经导入, 如: INSTALLED_APPS = ...

  7. VS2010 根据模型生成数据库 打开edmx.sql文件时 vs出现无响应的解决方案

    今天在VS2010 sp1+sql server 2008 R2+Win7操作系统下测试ADO.NET 实体数据模型时 ,遇到这样一个问题. 首先建好实体模型,然后"根据模型生成数据库&qu ...

  8. django 模型

    一.project 与app之间的关系 1个project中可包含多个app eg:包含两个app的project的结构

  9. Django模型层Meta内部类详解

    Django 模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性.以下对此作一总结: abstract      这个属性是定义当前的模型类是不是一个抽象类.所谓抽象类是不会对应 ...

随机推荐

  1. HDU 1506 Largest Rectangle in a Histogram(单调栈、笛卡尔树)

    题意:给定n个连续排列的矩形的高,矩形的宽都为1.问最大矩形覆盖. 例如:n = 7,h[i] = (2 1 4 5 1 3 3),最大覆盖为8. Sample Input 7 2 1 4 5 1 3 ...

  2. layer父页面调用子页面的方法

    由于不知道如何在子页面获取到layer定义的确定按钮,于是就在子页面上定义了一个方法,然后在由父页面在点确定按钮时调用子页面所定义的这个方法,从而执行子页面方法里面的内容: 子页面代码: functi ...

  3. 《鸟哥的Linux私房菜》学习笔记(9)——条件判断

    一.条件判断表达式                                                          条件测试类型: 整数测试 字符测试 文件测试 条件测试的表达式 [ ...

  4. D3DXCreateTextureFromFile

    HRESULT D3DXCreateTextureFromFile( __in LPDIRECT3DDEVICE9 pDevice, __in LPCTSTR pSrcFile, __out LPDI ...

  5. Git的安装及常用操作

    一.Git的安装 1.下载Git,官网地址为:https://git-scm.com/downloads.     2.下载完成之后,双击目录进行安装 3.选择安装目录 4.选择组件,默认即可 5.设 ...

  6. 【网易严选】iOS持续集成打包(Jenkins+fastlane+nginx)

    本文来自网易云社区 作者:孙娇 严选iOS客户端的现有打包方式是通过远程连接打包机执行脚本去打包,打完包会输出相应的ipa的二维码,扫一扫二维码可以安装,但是随着测试队伍的壮大,外包同学越来越多,在打 ...

  7. [netty4][netty-common]Future与Promise分析

    接口与类结构体系 -- [I]java.util.concurrent.Future<V> ---- [I]io.netty.util.concurrent.Future<V> ...

  8. Linux 的日常 tools

    Linux基础命令里的就不再赘述了. Table of Contents 一.下载(命令行工具,只给出常用的命令说明) wget/cURL(一般系统自带) aria2/axel多线程下载 1. ari ...

  9. linux下telnet安装与使用

    现在管理linux基本都用crt.xshell或者putty,已经没什么人用telnet,因为后续需要讲zabbix免客户端监控只telnet,通过telnet来监控服务器性能. yum安装telne ...

  10. Generator与async/await与Generator的模拟

    Generator 函数有多种理解角度.语法上,首先可以把它理解成,Generator 函数是一个状态机,封装了多个内部状态. 执行 Generator 函数会返回一个遍历器对象,也就是说,Gener ...