模型如下:

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. 数据结构-队列(Queue)

    #include <stdio.h> #include <stdlib.h> #define LIST_INIT_SIZE 10 #define LISTINCREMENT 1 ...

  2. Django2.2使用mysql数据库pymysql版本不匹配问题的解决过程与总结

    前置条件 django版本:2.2.1 python版本:3.6.6 mysql版本:mysql-community8.0.15 问题 在搭建django项目,配置mysql数据库时遇到无法迁移数据库 ...

  3. GoF23种设计模式之创建型模式之工厂方法模式

    一.概述 定义一个用于创建对象的接口,让子类去决定实例化哪个类.工厂方法将一个类的实例化延迟至其子类. 二.适用性 1.当一个类不知道它所必须创建的对象的类的时候. 2.当一个类希望由其子类来指定它所 ...

  4. (转)iOS静态库与动态库的区别

    一.什么是库? 库是共享程序代码的方式,一般分为静态库和动态库. 静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝. 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用 ...

  5. HBase(0.94.5)的Compact和Split源码分析

    经过对比,0.94.5以后版本主要过程基本类似(有些新功能和细节增加) 一.       Compact 2.1.   Compact主要来源 来自四个方面:1.Memstoreflush时:2.HR ...

  6. Sicily 8843 Ranking and Friendship

    http://soj.me/8843 题意:几个人想做好朋友,朋友之间相差位置小于等于k,且长度相同分析:排序,将长度相同的放在一起.若长度相同,第i个人能放进去的条件是位置相差下雨等于k.      ...

  7. luogu2023 [AHOI2009]维护序列

    线段树加乘懒标记裸题. #include <iostream> #include <cstdio> using namespace std; typedef long long ...

  8. BugKu-图穷匕见

    拿到图片后,先放到winhex,看看文件头是不是和jpg匹配,看看文件尾,不是FFD9 ,说明后边肯定是藏了什么东西. 顺便找一下文件尾有没有flag(估计是签到题目才会这样吧). binwalk跑一 ...

  9. python 学习分享-迭代器与生成器篇

    迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式.. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后 ...

  10. Python的网络编程socket模块

    (1)利用socket进行简单的链接 Python里面的socket支持UDP.TCP.以及进程间的通信,socket可以把我们想要发送的东西封装起来,发送过去,然后反解成原来的样子,事实上网路通信可 ...