Python - Django - ORM 多对多操作
models.py:
from django.db import models # 出版社
class Publisher(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=64, null=False, unique=True) def __str__(self):
return "<Publisher object: {}>".format(self.name) # 书籍
class Book(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=64, null=False, unique=True)
publisher = models.ForeignKey(to="Publisher") def __str__(self):
return "<Book object: {}>".format(self.title) # 作者
class Author(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=16, null=False, unique=True)
book = models.ManyToManyField(to="Book") # 多对多关联 Book 表,ORM 会自动生成第 3 张表 def __str__(self):
return "<Author object: {}>".format(self.name)
book 表:

author 表:

author 和 book 关联的第三张表,author_book 表:

publisher 表:

多对多的查询:
orm.py:
import os if __name__ == '__main__':
# 加载 Django 项目的配置信息
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
# 导入 Django,并启动 Django 项目
import django
django.setup() from app01 import models author_obj = models.Author.objects.get(id=2) # 获取 id 为 2 的作者
ret = author_obj.book.all() # 查询 id 为 2 的作者写的所有书
print(ret)
运行结果:

create():
创建一个新的对象,保存对象,并将它添加到关联对象集之中,返回新创建的对象。
orm.py:
import os if __name__ == '__main__':
# 加载 Django 项目的配置信息
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
# 导入 Django,并启动 Django 项目
import django
django.setup() from app01 import models author_obj = models.Author.objects.get(id=1) # 获取 id 为 1 的作者
author_obj.book.create(title="《PHP》", publisher_id=2) # 通过该作者创建一本书
运行结果:


add():
把指定的 model 对象添加到关联对象集中
orm.py:
import os if __name__ == '__main__':
# 加载 Django 项目的配置信息
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
# 导入 Django,并启动 Django 项目
import django
django.setup() from app01 import models # 把 id 为 2 的书添加给 id 为 4 的作者
author_obj = models.Author.objects.get(id=4)
book_obj = models.Book.objects.get(id=2)
author_obj.book.add(book_obj) # 也可以直接使用 id 添加
# author_obj.book.add(2)
运行结果:

添加多个
orm.py:
import os if __name__ == '__main__':
# 加载 Django 项目的配置信息
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
# 导入 Django,并启动 Django 项目
import django
django.setup() from app01 import models # 添加多个,把 id 大于 4 的书添加给 id 为 3 的作者
author_obj = models.Author.objects.get(id=3)
book_objs = models.Book.objects.filter(id__gt=4)
author_obj.book.add(*book_objs) # 要用 * 把列表打散再传进去
运行结果:

remove():
从关联对象集中移除执行的 model 对象。
orm.py:
import os if __name__ == '__main__':
# 加载 Django 项目的配置信息
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
# 导入 Django,并启动 Django 项目
import django
django.setup() from app01 import models author_obj = models.Author.objects.get(id=3)
book_obj = models.Book.objects.get(title="《PHP》")
author_obj.book.remove(book_obj) # 删除与 title 字段为 《PHP》 的关联
author_obj.book.remove(5) # 直接删除
运行结果:

原先 id 为 3 的作者关联的两本书籍本删除了
clear():
从关联对象集中清空一切对象。
orm.py:
import os if __name__ == '__main__':
# 加载 Django 项目的配置信息
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
# 导入 Django,并启动 Django 项目
import django
django.setup() from app01 import models # 把 id 为 4 的作者的书籍全清空
author_obj = models.Author.objects.get(id=4)
author_obj.book.clear()
运行结果:

author_id=4 的内容全被清空了
set():
更新 model 对象的关联对象。
orm.py:
import os if __name__ == '__main__':
# 加载 Django 项目的配置信息
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
# 导入 Django,并启动 Django 项目
import django
django.setup() from app01 import models # 给 id 为 4 的作者添加 id 为 2、3 的两本书
author_obj = models.Author.objects.get(id=4)
author_obj.book.set([2, 3])
运行结果:

外键补充:
外键中的 clear() 和 remove() 方法只能在 null=True 时用
models.py 中的 Book 类:
# 书籍
class Book(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=64, null=False, unique=True)
publisher = models.ForeignKey(to="Publisher", null=True) # 把 null 设置为 True def __str__(self):
return "<Book object: {}>".format(self.title)
orm.py:
import os if __name__ == '__main__':
# 加载 Django 项目的配置信息
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
# 导入 Django,并启动 Django 项目
import django
django.setup() from app01 import models # 清空 id 为 2 的出版社中的书籍
publisher_obj = models.Publisher.objects.get(id=2)
publisher_obj.book_set.clear()
运行结果:

publisher_id 为 2 全变为 0
Python - Django - ORM 多对多操作的更多相关文章
- Python - Django - ORM 多对多表结构的三种方式
多对多的三种方式: ORM 自动创建第三张表 自己创建第三张表, 利用外键分别关联作者和书,关联查询比较麻烦,因为没办法使用 ORM 提供的便利方法 自己创建第三张表,使用 ORM 的 ManyToM ...
- Django ORM 多对多操作 使用聚合函数和分组 F查询与Q查询
创建表 # models.py form django.db import models class Book(models.Model): # 表名book,django会自动使用项目名+我们定义的 ...
- django ORM多对多操作
创建多对多: 方式一:自定义关系表 class Host(models.Model): nid = models.AutoField(primary_key=True) hostname = mode ...
- Python - Django - ORM 外键操作
models.py: from django.db import models # 出版社 class Publisher(models.Model): id = models.AutoField(p ...
- Django ORM那些相关操作zi
Django ORM那些相关操作 一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs) ...
- Django ORM 那些相关操作
Django ORM 那些相关操作 一般操作 必知必会13条 <> all(): #查询所有的结果 <> filter(**kwargs) # 它包含了与所给筛选条件相匹配的对 ...
- Django ORM 多表操作
目录 Django ORM 多表操作 表模型 表关系 创建模型 逆向到表模型 插入数据 ORM 添加数据(添加外键) 一对多(外键 ForeignKey) 一对一 (OneToOneFeild) 多对 ...
- Django ORM那些相关操作
一般操作 https://docs.djangoproject.com/en/1.11/ref/models/querysets/ 官网文档 常用的操作 <1> all() ...
- 18-2 djanjo中间件和orm多对多操作,以及ajax
一 中间件 0 怎样使用中间件 在setting配置文件里面注册你的中间件,如下: 'mymiddleware.MD1', 前面是文件名,后面是类名 然后在你的mymiddleware文件里导入: ...
随机推荐
- 错误信息: The server cannot or will not process the request due to something that is perceived to be a client error
错误原因:在提交的表单中有 date 类型的数据,也就是不能传输日期类型的数据. 嗯!我知道,去吧!
- getchar()函数举例
#include<stdio.h>void main(){ char ch; ch=getchar(); printf("%c",ch);}
- 指数基金介绍专栏(8):国企指数(H股指数)详细介绍,最新资料解析,看这一篇就够了
作者:牛大 | 公众号:定投五分钟 大家好,我是牛大.每天五分钟,投资你自己:坚持基金定投,终会财富自由! 昨天牛大给大家介绍了恒生指数,没看的朋友可以去公众号看一下. 指数基金介绍专栏(7):恒生指 ...
- php使用WebUploader做大文件的分块和断点续传
核心原理: 该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开 ...
- 洛谷P1706全排列问题
P1706 全排列问题 题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入输出格式 输入格式: n(1≤n≤9) 输出格式: 由1-n组 ...
- 【数论】P1029 最大公约数和最小公倍数问题
题目链接 P1029 最大公约数和最小公倍数问题 思路 如果有两个数a和b,他们的gcd(a,b)和lcm(a,b)的乘积就等于ab. 也就是: ab=gcd(a,b)*lcm(a,b) 那么,接下来 ...
- 19、Executor原理剖析与源码分析
一.原理图解 二.源码分析 1.Executor注册机制 worker中为Application启动的executor,实际上是启动了这个CoarseGrainedExecutorBackend进程: ...
- [内网渗透]lcx端口转发
0x01 简介 lcx是一款端口转发工具,有三个功能: 第一个功能将本地端口转发到远程主机某个端口上 第二个功能将本地端口转发到本地另一个端口上 第三个功能是进行监听并进行转发使用 Lcx使用的前提是 ...
- VsCode插件与Node.js交互通信
首先关于VsCode插件通信,如果不明白的可以参考我的这篇博客VsCode插件开发之插件初步通信 如果需要详细例子的话,可以参考VsCode插件开发 现在又有一个新的需求是,VsCode插件可以通过j ...
- Mybatis传参- 被逗号分割的字符串
String ids = "1,2,3,4,5,6",如ids作为参数传递,查询list返回.mybatis用foreach处理并返回. SELECT * FROM yp_popu ...