模型如下:

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. printf("\033[1;33m ***** \033[0m \n");

    printf("\033[1;33m Hello World. \033[0m \n"); 颜色如下: none = "\033[0m" black = &qu ...

  2. POJ 3041 Asteroids (二分图最小点覆盖集)

    Asteroids Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 24789   Accepted: 13439 Descr ...

  3. mysql进阶二

    数据库存储数据的特点: 1.数据存放到表中,然后表再放到库中 2.一个库中可以有多张表,每张表具有唯一的表名来标识自己 3.表中有一个或多个列,列又称为“字段” 数据库常见的管理系统 mysql.or ...

  4. Linuxshell编程

    重点回顾: 1.由于核心的内存中是受保护的区块,因此我们必须要透过“shell”将我们输入的指令与Kernel沟通,好让Kernel可以控制硬件来正确无误的工作 2.学习shell的原因主要有:文字接 ...

  5. IOS笔记048-数据存储

      IOS数据存储的几种方式         XML属性列表(plist)         归档 Preference(偏好设置)          NSKeyedArchiver归档(NSCodin ...

  6. ogre3D学习基础12 --- 让机器人动起来(移动模型动画)

    学了那么长时间,才学会跑起来.My Ogre,动起来. 第一,还是要把框架搭起来,这里我们用到双端队列deque,前面已经简单介绍过,头文件如下: #include "ExampleAppl ...

  7. hnust 懒人多动脑

    问题 F: 懒人得多动脑 时间限制: 1 Sec  内存限制: 128 MB提交: 93  解决: 30[提交][状态][讨论版] 题目描述 小D的家A和学校B都恰好在以点F为焦点的双曲线上,而小D每 ...

  8. Leetcode 629.K个逆序对数组

    K个逆序对数组 给出两个整数 n 和 k,找出所有包含从 1 到 n 的数字,且恰好拥有 k 个逆序对的不同的数组的个数. 逆序对的定义如下:对于数组的第i个和第 j个元素,如果满i < j且  ...

  9. [oldboy-django][4python面试]有关yield那些事

    1 yield 在使用send, next时候的区别(举例m = yield 5) 无论send,next首先理解m = yield 5 是将表达式"yield 5 "的结果返回给 ...

  10. jquery实现跨域请求(复制)

    很多开发人员在使用jquery在前端和服务器端进行数据交互,所以很容易会认为在前端利用jquery就可以读取任何站点的数据了.近日在进行开 发时,因为要和第三方公司的一个项目进行数据的共享,因为考虑多 ...