Django的多对多关系

在Django的关系中,有一对一,一对多,多对多的关系

我们这里谈的是多对多的关系

我们首先来设计一个用于示例的表结构

# -*- coding: utf-8 -*-
from __future__ import unicode_literals from django.db import models # Create your models here. class Book(models.Model):
name = models.CharField(max_length = 32) def __str__(self):
return self.name.decode("utf-8") def __unicode(self):
return self.name.decode("utf-8") class Author(models.Model):
name = models.CharField(max_length = 32)
m = models.ManyToManyField('Book') def __str__(self):
return self.name.decode("utf-8") def __unicode(self):
return self.name.decode("utf-8")

我们可以看到,这个多对多的关系在 作者这个表里

事实上,多对多多关系可以存在于任何一方

我们现在把这个关系放在作者这一方

作者和书籍是多对多的关系

我们现在来创造一些测试数据

In [1]: from app_many_models_01 import models

In [2]: models.Author.objects.create(name = u'张三')
Out[2]: <Author: 张三> In [3]: models.Author.objects.create(name = u'赵一')
Out[3]: <Author: 赵一> In [4]: models.Author.objects.create(name = u'张六')
Out[4]: <Author: 张六> In [5]: models.Author.objects.create(name = u'李七')
Out[5]: <Author: 李七>
In [6]: models.Book.objects.create(name = u'python编程')
Out[6]: <Book: python编程> In [7]: models.Book.objects.create(name = u'Go编程')
Out[7]: <Book: Go编程> In [8]: models.Book.objects.create(name = u'Java编程')
Out[8]: <Book: Java编程> In [9]: models.Book.objects.create(name = u'shell编程')
Out[9]: <Book: shell编程> In [10]: models.Book.objects.create(name = u'Lua编程')
Out[10]: <Book: Lua编程> In [11]: models.Book.objects.create(name = u'Ruby编程')
Out[11]: <Book: Ruby编程> In [12]: models.Book.objects.create(name = u'PHP编程')
Out[12]: <Book: PHP编程> In [13]: models.Book.objects.create(name = u'Perl编程')
Out[13]: <Book: Perl编程> In [14]: models.Book.objects.create(name = u'AI编程')
Out[14]: <Book: AI编程>

通过上面的测试数据,我们创建了作者表和书籍表

下面我们进行表的关系的编写

In [1]: from app_many_models_01 import models

In [2]: p = models.Book.objects.get(name = "Python编程")

In [3]: php = models.Book.objects.get(name = "PHP编程")

In [4]: pe = models.Book.objects.get(name = "Perl编程")

In [5]: zhangliu = models.Author.objects.get(name = u"张六")

In [6]: zhang = models.Author.objects.get(name = u"张三")

In [7]: li  = models.Author.objects.get(name = u"李七")

In [8]: zhao = models.Author.objects.get(name = u"赵二")

到此,我们仍然没有为表之间创建关系

那么,开始吧

In [18]: zhao.m.add(p)

In [65]: zhang.m.create(name=u"Basic编程")
Out[65]: <Book: Basic编程> In [66]: zhang.m.add(php) In [67]: zhang.m.add(pe) In [68]: zhang.m.add(p,php,pe) In [69]: zhang.m.add(p,php,pe,go)

上面都是从作者表出发的添加关系的操作

zhang是我们拿到的对应到 张三的 这个作者的对象

zhang.m 对应到表之间的关系就是作者表里面的多对多关系的书籍表对象

zhang.m.add就是给作者表的书籍表这个对应关系添加上具体的对应指向

而zhang.m.create这个很有意思,zhang.m其实就是跨表了,跨到了书籍表,到了书籍表,自然可以创建书籍啊,那么这就是创建书籍对象

add方法可以一次添加一个关系,也可以一次添加多个关系


我们再从书籍表出发,来添加两个表之间的映射关系

In [73]: zhang.m.create(name=u"vb编程")
Out[73]: <Book: vb编程> In [74]: b = models.Book.objects.get(name = u"vb编程" ) In [75]: b.author_set.all()
Out[75]: <QuerySet [<Author: 张三>]>

其实从上面我们已经可以看出来了

因为多对多的关系是放在作者表中的,那么类似一对多的关系的是

从一的那一方出发,都是用到XXX_set这种映射

就拿到了这个一对应的多(而这里其实是多对多)的多的那一方的跨表查询的结果

通过这个跨表查询的操作,就可以干你想干的事情了

mysql> use test_many_models;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A Database changed
mysql> select * from app_many_models_01_author;
+----+--------+
| id | name |
+----+--------+
| 1 | 张三 |
| 2 | 赵一 |
| 3 | 张六 |
| 4 | 李七 |
+----+--------+
4 rows in set (0.00 sec)
mysql> select * from app_many_models_01_author_m;
+----+-----------+---------+
| id | author_id | book_id |
+----+-----------+---------+
| 11 | 1 | 1 |
| 16 | 1 | 2 |
| 14 | 1 | 7 |
| 15 | 1 | 8 |
| 12 | 1 | 14 |
| 13 | 1 | 15 |
| 17 | 1 | 16 |
| 7 | 3 | 3 |
| 6 | 3 | 9 |
| 18 | 4 | 16 |
+----+-----------+---------+
10 rows in set (0.00 sec)

通过查询结果,我们可以看到,已经成功的添加了vb编程这本书籍的作者了,并且是从书籍这张表出发添加的

说完了添加关系操作,我们再谈谈删除和清除关系的操作

In [77]: zhang.m.remove(b)


mysql> select id from app_many_models_01_book where name="vb编程";
+----+
| id |
+----+
| 16 |
+----+
1 row in set (0.00 sec) mysql> select * from app_many_models_01_author_m;
+----+-----------+---------+
| id | author_id | book_id |
+----+-----------+---------+
| 11 | 1 | 1 |
| 16 | 1 | 2 |
| 14 | 1 | 7 |
| 15 | 1 | 8 |
| 12 | 1 | 14 |
| 13 | 1 | 15 |
| 17 | 1 | 16 |
| 7 | 3 | 3 |
| 6 | 3 | 9 |
| 18 | 4 | 16 |
+----+-----------+---------+
10 rows in set (0.00 sec) mysql> select * from app_many_models_01_author_m;
+----+-----------+---------+
| id | author_id | book_id |
+----+-----------+---------+
| 11 | 1 | 1 |
| 16 | 1 | 2 |
| 14 | 1 | 7 |
| 15 | 1 | 8 |
| 12 | 1 | 14 |
| 13 | 1 | 15 |
| 7 | 3 | 3 |
| 6 | 3 | 9 |
| 18 | 4 | 16 |
+----+-----------+---------+
9 rows in set (0.00 sec)

remove操作就是删除某个或者多个关系(可以一次传入多个参数)

可以看到,经过了remove操作,就把 vb编程这本书籍从张三这个作者的相关书籍中去掉了


我们再来看clear操作

mysql> select id  from app_many_models_01_author where name = "李七";
+----+
| id |
+----+
| 4 |
+----+
1 row in set (0.00 sec) mysql> select book_id from app_many_models_01_author_m where author_id="4";
+---------+
| book_id |
+---------+
| 16 |
+---------+
1 row in set (0.00 sec)

在执行clear操作前,我们可以看到作者李七有一本书籍,编号是16,即vb编程

那么,我们开始执行clear操作

In [78]: li.m.clear()

我们再来看看现在李七这个作者还有什么书籍?

mysql> select book_id  from app_many_models_01_author_m where author_id="4";
Empty set (0.00 sec)

可见,clear这种操作是清除关系的,把某个关系全部清除

python django的ManyToMany简述的更多相关文章

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

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

  2. 基于Python+Django的Kubernetes集群管理平台

    ➠更多技术干货请戳:听云博客 时至今日,接触kubernetes也有一段时间了,而我们的大部分业务也已经稳定地运行在不同规模的kubernetes集群上,不得不说,无论是从应用部署.迭代,还是从资源调 ...

  3. python——django使用mysql数据库(二)

    上一篇中,我们已经讲述了如何初始化一个django数据库,这一章就来讲讲在实际的项目中如何使用我们初始化的数据库呢? 如还未进行初始化数据库操作,请参考python——django使用mysql数据库 ...

  4. python——django使用mysql数据库(一)

    之前已经写过如何创建一个django项目,现在我们已经有了一个小骷髅,要想这个web工程变成一个有血有肉的人,我们还需要做很多操作.现在就先来介绍如何在django中使用mysql数据库. 前提:已经 ...

  5. 如何查看PYTHON Django的保存路径

    如何查看PYTHON Django的保存路径 $ python -c " import sys sys.path = sys.path[1:] import django print(dja ...

  6. python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API

    python  Django教程  之 模型(数据库).自定义Field.数据表更改.QuerySet API 一.Django 模型(数据库) Django 模型是与数据库相关的,与数据库相关的代码 ...

  7. python Django教程 之模板渲染、循环、条件判断、常用的标签、过滤器

    python3.5 manage.py runserver python Django教程 之模板渲染.循环.条件判断.常用的标签.过滤器 一.Django模板渲染模板 1. 创建一个 zqxt_tm ...

  8. python Django教程 之 安装、基本命令、视图与网站

    python  Django教程  之 安装.基本命令.视图与网站 一.简介 Django 中提供了开发网站经常用到的模块,常见的代码都为你写好了,通过减少重复的代码,Django 使你能够专注于 w ...

  9. python django 多级业务树形结构规划及页面渲染

    概述: 在项目中,父级到子级结构并不少见,如果仅仅的两层树形结构,我们可以使用数据库的外键设计轻松做到,子级业务表设计一字段外键到父级业务表,这样子到父.父到子的查询都非常简单. 但是往往父子结构会有 ...

随机推荐

  1. 论文笔记(6):Weakly-and Semi-Supervised Learning of a Deep Convolutional Network for Semantic Image Segmentation

    这篇文章的主要贡献点在于: 1.实验证明仅仅利用图像整体的弱标签很难训练出很好的分割模型: 2.可以利用bounding box来进行训练,并且得到了较好的结果,这样可以代替用pixel-level训 ...

  2. TP5模型关联问题

    在使用模型关联时:假如有表   merchant商户表   m_store 店铺表  m_store_ref 商户店铺关联表  user 普通用户表 $mer = Merchant::with([ ' ...

  3. 未来已来,腾讯AI计算网络

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:由鹅厂网事发表在云+社区 "鹅厂网事"由深圳市腾讯计算机系统有限公司技术工程事业群网络平台部运营,我们希望与业界各位志同道合的伙伴交流 ...

  4. openssh/openssl升级到7.4和1.0.2j 源码方式

    #!/bin/bashtar -xvf openssh-7.4p1.tar.gztar -xvf openssl-1.0.2j.tar.gz 升级 openssl 到1.0.2jcd openssl- ...

  5. Android开发——设置界面的创建

    前言: 最近忙着搞项目,难得有时间,便来整理搞项目中学习到的知识 使用之前,先介绍一下android这种的五种数据储存方式,分别为文件储存,SharePrefence,SQL,使用ContentPro ...

  6. 基于Jmeter的自动化测试实施方案设计

    前言: Jmeter是目前最流行的一种测试工具,基于此工具我们搭建了一整套的自动化方案,包括了脚本添加配置.本地配置和运行.服务器配置等内容,完成了自动化测试闭环,通过这种快捷简便高效的方式,希望可以 ...

  7. zabbix添加自定义监控项

    zabbix添加自定义监控项 author:headsen  chen   2017-10-16  17:23:17 个人原创,转载请注明作者,出处,否则依法追究法律责任 主机端配置: 首先安装好za ...

  8. freemarker的classic_compatible设置,解决报空错误

    前段时间接触freemaker时,本来后端写各接口运行正常,但加入了模板后,频繁报空指针问题,整了许久,最后还是请教了别人解决了这个问题,现在记录下来,方便以后碰到了可以查阅. 错误样例如下: ERR ...

  9. GEETEST极验召集互联网大佬齐聚光谷,共同探讨交互安全问题

    全球互联网技术在飞速发展的同时,网络安全事件也随之频发.除了直接带来经济损失的网络恶意攻击之外,企业在多个方面也遭受着不同程度的网络恶意攻击,包括品牌形象.管理时间.企业竞争力.客户成交量.用户行为等 ...

  10. RESTful WebService 入门实例

      /* 新建MavenProject,使用以下代码,创建类和POM文件.使用命令行切换到Project根目录,运行mvn package(或者,选中pom.xml 文件右键单击 > run a ...