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文件里导入: ...
随机推荐
- md5关于加密
# 导入hashlib模块 import hashlib # 获取MD5对象 # 不加盐操作 # md5 = hashlib.md5() # 加盐操作 md5 = hashlib.md5('wenwe ...
- [Svelte 3] Use Svelte 3 transitions to gracefully show and hide DOM elements
Most websites are quite static and adding some animations/transitions can improve the user experienc ...
- 使用Default Trace查看谁还原了你的数据库?
select e.nameaseventclass,t.loginname,t.spid,t.starttime, t.textdata,t.objectid,t.objectname,t.datab ...
- php 程序执行时间检测
我们有的时经常需要做程序的执行时间执行效率判断.大理石平台检定规程 实现的思路如下: <?php //记录开始时间 //记录结整时 // 开始时间 减去(-) 结束时间 得到程序的运行时间 ...
- jsp实现大文件上传分片上传断点续传
1,项目调研 因为需要研究下断点上传的问题.找了很久终于找到一个比较好的项目. 在GoogleCode上面,代码弄下来超级不方便,还是配置hosts才好,把代码重新上传到了github上面. http ...
- 计数器的原理,设计及verilog实现
若计数器由n个触发器组成,则计数器的位数为n,所能计数的最大模数为2的n次幂.以下为同步二进制加法计数器电路; 驱动方程:状态图 状态方程(此时的Q0,Q1为上一次状态值): 下例是同步4位2进制计数 ...
- POJ 1927 Area in Triangle
Area in Triangle Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 1674 Accepted: 821 D ...
- C语言实现多线程排序
#include <stdio.h> #include <pthread.h> #include <stdlib.h> #include <string.h& ...
- 2019.11.11 模拟赛 T2 乘积求和
昨天 ych 的膜你赛,这道题我 O ( n4 ) 暴力拿了 60 pts. 这道题的做法还挺妙的,我搞了将近一天呢qwq 题解 60 pts 根据题目给出的式子,四层 for 循环暴力枚举统计答案即 ...
- CStatic 控件设置文本,不能重回问题
CStatic m_page_text_; m_page_text_.SetWindowText(str); CRect rt; m_page_text_.GetWindowRect(&rt) ...