django -- 多对多关系的实现
在django中表和表之间的多对多关系有两种实现方案:
方案一:直接使用django自动实现的多对多关系。
方案二:自己写连接表、然而告诉django在实现多对多关系时要使用的连接表。
一、方案一:
model的定义
from django.db import models class Person(models.Model):
name= models.CharField(max_length=16)
birthday=models.DateField()
class Group(models.Model):
name= models.CharField(max_length=16)
members = models.ManyToManyField(Person)
对应的SQL代码:
BEGIN;
--
-- Create model Group
--
CREATE TABLE "polls_group" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"name" varchar(16) NOT NULL);
--
-- Create model Person
--
CREATE TABLE "polls_person" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"name" varchar(16) NOT NULL,
"birthday" date NOT NULL);
--
-- Add field members to group
--
CREATE TABLE "polls_group_members" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"group_id" integer NOT NULL REFERENCES "polls_group" ("id"),
"person_id" integer NOT NULL REFERENCES "polls_person" ("id")); CREATE UNIQUE INDEX "polls_group_members_group_id_person_id_ce176f60_uniq"
ON "polls_group_members" ("group_id", "person_id"); CREATE INDEX "polls_group_members_group_id_f4695d83"
ON "polls_group_members" ("group_id"); CREATE INDEX "polls_group_members_person_id_fb30aa04"
ON "polls_group_members" ("person_id"); COMMIT; -- ----------------------------
delimiter //
create procedure sp_a(a int)
BEGIN
insert into t1(x,a) values(100,a);
end //
delimiter ;
二、方案二:
model的定义
from django.db import models class Person(models.Model):
name= models.CharField(max_length=16)
birthday=models.DateField() def __str__(self):
return self.name class Group(models.Model):
name= models.CharField(max_length=16)
members = models.ManyToManyField(Person,through=MemberShip) class MemberShip(models.Model):
person = models.ForeignKey(Person)
group = models.ForeignKey(Group) date_join=models.DateTimeField()
invite_reason=models.CharField(max_length=100)
对应的SQL代码:
BEGIN;
--
-- Create model Group
--
CREATE TABLE "polls_group" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"name" varchar(16) NOT NULL);
--
-- Create model MemberShip
--
CREATE TABLE "polls_membership" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"date_join" datetime NOT NULL,
"invite_reason" varchar(100) NOT NULL,
"group_id" integer NOT NULL REFERENCES "polls_group" ("id"));
--
-- Create model Person
--
CREATE TABLE "polls_person" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"name" varchar(16) NOT NULL,
"birthday" date NOT NULL);
--
-- Add field person to membership
--
ALTER TABLE "polls_membership" RENAME TO "polls_membership__old";
CREATE TABLE "polls_membership" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"date_join" datetime NOT NULL,
"invite_reason" varchar(100) NOT NULL,
"group_id" integer NOT NULL REFERENCES "polls_group" ("id"),
"person_id" integer NOT NULL REFERENCES "polls_person" ("id")); INSERT INTO "polls_membership" ("id", "date_join", "invite_reason", "group_id", "person_id") SELECT "id", "date_join", "invite_reason", "group_id", NULL FROM "polls_membership__old";
DROP TABLE "polls_membership__old";
CREATE INDEX "polls_membership_group_id_19f13d47" ON "polls_membership" ("group_id");
CREATE INDEX "polls_membership_person_id_fa058fab" ON "polls_membership" ("person_id");
--
-- Add field members to group
--
CREATE TABLE "polls_group_members" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"group_id" integer NOT NULL REFERENCES "polls_group" ("id"),
"person_id" integer NOT NULL REFERENCES "polls_person" ("id")); CREATE UNIQUE INDEX "polls_group_members_group_id_person_id_ce176f60_uniq" ON "polls_group_members" ("group_id", "person_id");
CREATE INDEX "polls_group_members_group_id_f4695d83" ON "polls_group_members" ("group_id");
CREATE INDEX "polls_group_members_person_id_fb30aa04" ON "polls_group_members" ("person_id");
COMMIT;
三、由上面的SQL可以看出django来只是定义了memberShip模式对应的表、它自己也并没有放弃自己的那一套:
model 的定义:
from django.db import models class Person(models.Model):
name= models.CharField(max_length=16)
birthday=models.DateField() class Meta():
db_table="person" class Group(models.Model):
name= models.CharField(max_length=16)
members = models.ManyToManyField(Person,through='MemberShip') class Meta():
db_table="group" class MemberShip(models.Model):
person = models.ForeignKey(Person)
group = models.ForeignKey(Group) date_join=models.DateTimeField()
invite_reason=models.CharField(max_length=100) class Meta():
db_table="membership"
对应的SQL代码:
BEGIN;
--
-- Create model Group
--
CREATE TABLE "group" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"name" varchar(16) NOT NULL);
--
-- Create model MemberShip
--
CREATE TABLE "membership" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"date_join" datetime NOT NULL,
"invite_reason" varchar(100) NOT NULL,
"group_id" integer NOT NULL REFERENCES "group" ("id"));
--
-- Create model Person
--
CREATE TABLE "person" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"name" varchar(16) NOT NULL,
"birthday" date NOT NULL);
--
-- Add field person to membership
--
ALTER TABLE "membership" RENAME TO "membership__old";
CREATE TABLE "membership" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"date_join" datetime NOT NULL,
"invite_reason" varchar(100) NOT NULL,
"group_id" integer NOT NULL REFERENCES "group" ("id"),
"person_id" integer NOT NULL REFERENCES "person" ("id")); INSERT INTO "membership" ("id", "date_join", "invite_reason", "group_id", "person_id")
SELECT "id", "date_join", "invite_reason", "group_id", NULL FROM "membership__old"; DROP TABLE "membership__old"; CREATE INDEX "membership_group_id_786fce67" ON "membership" ("group_id");
CREATE INDEX "membership_person_id_8ed25d16" ON "membership" ("person_id");
--
-- Add field members to group
--
ALTER TABLE "group" RENAME TO "group__old";
CREATE TABLE "group" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"name" varchar(16) NOT NULL); INSERT INTO "group" ("id", "name")
SELECT "id", "name" FROM "group__old"; DROP TABLE "group__old";
COMMIT;
总结:
1、在定义模式时指定数据库中的表名是一个好的习惯、这样django就不会建立一些不需要的表了。
2、对于多对多关系还是自己实现多对多关系比较好、一来可以保存一些额外的有用信息、表名也更加统一。
----
django -- 多对多关系的实现的更多相关文章
- Django多对多关系建立及Form组件
目录 Django多对多关系 1.创建方式一全自动 2.创建方式二纯手撸 3.半自动(推荐使用) forms校验组件 使用forms组件实现注册功能 form常用字段和插件 数据校验 钩子函数 HOO ...
- Django --- 多对多关系创建,forms组件
目录 多对多三种创建方式 1.系统直接创建 2.自己手动创建 3.自己定义加与系统创建 forms组件 1. 如何使用forms组件 2. 使用forms组件校验数据 3. 使用forms组件渲染标签 ...
- Django 多对多 关系
多对多,本意就是多个一对多的关系 定义多对多 ManyToManyField 字段 from django.db import models # 学生类 class Student(models.Mo ...
- django 学习-10 Django多对多关系模型
1.vim blog/models.py class Author(models.Model): name = models.CharField(max_length=30) def unicod ...
- django笔记-模型数据模板呈现过程记录(多对多关系)
首先,推荐一个网址:http://www.tuicool.com/articles/BfqYz2F,因为这里的比我的要有条理,更有利于各位的理解. 以下仅为为个人一次不完整的笔记: 环境:ubuntu ...
- Django 一对多,多对多关系解析
[转]Django 一对多,多对多关系解析 Django 的 ORM 有多种关系:一对一,多对一,多对多. 各自定义的方式为 : 一对一: OneToOneField ...
- django ORM模型表的一对多、多对多关系、万能双下划线查询
一.外键使用 在 MySQL 中,如果使用InnoDB引擎,则支持外键约束.(另一种常用的MyIsam引擎不支持外键) 定义外键的语法为fieldname=models.ForeignKey(to_c ...
- Django 之多对多关系
1. 多对多关系 作者 <--> 书籍 1. 表结构设计 1. SQL版 -- 创建作者表 create table author( id int primary key auto_inc ...
- Linux下开发python django程序(django数据库多对多关系)
1.多对多关系数据访问 models.py设置 from django.db import models # Create your models here. sex_choices=( ('f',' ...
随机推荐
- mule学习笔记
mule学习笔记 1.安装&配置 版本:mule 2.2.1 操作: 1) 下载.解压 2)配置环境变量:MULE_HOME.PATH 3)如果网络环境使用代理,找到%MULE_HOME%/c ...
- C/C++与Java的区别
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827273.html C/C++: C/C++代码——编译(不同的系统编译出不 ...
- 在Ubuntu上安装pyenv 相关问题Common build problems
Requirements: Ubuntu/Debian: sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libb ...
- java.lang.AbstractStringBuilder.enlargeBuffer
04-18 10:22:08.585 3653-3653/com.tongyan.lanzhou.rv I/dalvikvm: "main" prio=5 tid=1 RUNNAB ...
- Flash:利用Bitmapdata,ColorTransform,DrawPath,制造绚丽效果
JamesLi的文章:http://www.adobe.com/cn/devnet/actionscript/articles/silkflash-as.html 总结一下绚丽效果的核心: 1.利用一 ...
- 【Excle】一个比VLOOKUP牛的函数LOOKUP
1.根据时间查找最近发生的交易 2.多条件查找 3.反向查找 4.模糊匹配 上述例子充分说明了LOOKUP的查找特技,点击下载上述案例对应的Excle
- python模块之HTMLParser抓页面上的所有URL链接
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python模块之HTMLParser抓页面上的所有URL链接 import urllib #MyParse ...
- 图解Win7如何手动添加受信任证书
点击开始—>运行,如下图所示: 弹出“控制台”窗口如下,如下图所示: 点击“文件—添加/删除管理单元”,如下图所示: 选择“证书”,并点击“添加”,如下图所示: 在弹出的窗口上选 ...
- 基于源码编译openssl
openssh依赖于openssl,由于ssl频繁曝出漏洞,牵扯到openssh.而自身也存在漏洞... 00.下载openssl https://www.openssl.org/source/ ht ...
- Probability&Statistics 概率论与数理统计(1)
基本概念 样本空间: 随机试验E的所有可能结果组成的集合, 为E的样本空间, 记为S 随机事件: E的样本空间S的子集为E的随机事件, 简称事件, 由一个样本点组成的单点集, 称为基本事件 对立事件/ ...