Python笔记_50_ORM_多表操作
文章目录
- ORM多表操作
- 创建模型
- 一对多的新增
- 多对多的新增
- 关联管理器(RelatedManager)
- 基于对象的跨表查询
- 一对多关系
- 一对一的关系
- 多对多的关系
- 基于双下划线的跨表查询
- 一对多关系
- 多对多关系
- 一对一关系
- 连续跨表
ORM多表操作
创建模型
通过上图关系,来定义一下我们的模型类。
from django.db import modelsclass Book(models.Model):title = models.CharField(max_length=32)price = models.DecimalField(max_digits=5, decimal_places=2)pub_date = models.DateField()publish = models.ForeignKey("Publish", on_delete=models.CASCADE)authors = models.ManyToManyField("Author")class Publish(models.Model):name = models.CharField(max_length=32)city = models.CharField(max_length=64)email = models.EmailField()class Author(models.Model):name = models.CharField(max_length=32)age = models.SmallIntegerField()au_detail = models.OneToOneField("AuthorDetail", on_delete=models.CASCADE)class AuthorDetail(models.Model):gender_choices = ((0, "女"),(1, "男"),(2, "保密"),)gender = models.SmallIntegerField(choices=gender_choices)tel = models.CharField(max_length=32)addr = models.CharField(max_length=64)birthday = models.DateField()
一对多的新增
- 方式一 传对象的形式
def add_book(request):pub_obj = models.Publish.objects.get(pk=1)book = models.Book.objects.create(title="独孤九剑", price=140, pub_date="2008-08-23", publish=pub_obj)return HttpResponse("新增成功!")
- 方式二 传对象的id
def add_book(request):book = models.Book.objects.create(title="冲灵剑法", price=120, pub_date="2018-08-23", publish_id=pub_obj.pk)return HttpResponse("新增成功!")
多对多的新增
- 方式一 传对象的形式
def add_book(request):book_obj = models.Book.objects.get(pk=1)ling = models.Author.objects.get(pk=4)ying = models.Author.objects.get(pk=6)book_obj.authors.add(ling, ying)return HttpResponse("新增成功!")
- 方式二 传对象id
def add_book(request):book_obj = models.Book.objects.get(pk=2)ling = models.Author.objects.filter(name='令狐冲').first()book_obj.authors.add(ling.pk)return HttpResponse("新增成功!")
多对多其他常用API:
book_obj.authors.remove() # 将某个特定的对象从被关联对象集合中去除。 ====== book_obj.authors.remove(*[])
book_obj.authors.clear() #清空被关联对象集合
book_obj.authors.set() #先清空再设置
关联管理器(RelatedManager)
"关联管理器"是在一对多或者多对多的关联上下文中使用的管理器。
- 大前提:
- 多对多,双向都有
- 一对多时,对应多的一方才有(出版社的角度), 一对多时,反向才能使用关联管理器
def add_book(request):# add(obj1[, obj2, ...])方法author_obj = Author.objects.get(pk=1)book_obj = Book.objects.get(pk=2)author_obj.book_set.add(book_obj) # create(**kwargs)方法ling = models.Author.objects.get(pk=4)ling.book_set.create(title="吸星大法", price=110, pub_date="2011-12-12", publish_id=1)# remove(obj1[, obj2, ...])book_obj = Book.objects.get(pk=2)author_obj .book_set.remove(book_obj) # clear()# 从关联对象集中移除一切对象。author_obj = Author.objects.get(id=1)author_obj.book_set.clear()#注意这样不会删除对象 —— 只会删除他们之间的关联。# set()方法# 先清空,在设置,编辑书籍时即可用到。book = models.Book.objects.filter(title="独孤九剑").first()book.authors.set([1, 3])return HttpResponse("新增成功!")
注意:
对于所有类型的关联字段,add()、create()、remove()和clear(),set()都会马上更新数据库。换句话说,在关联的任何一端,都不需要再调用save()方法。
基于对象的跨表查询
一对多关系
- 正向
查询主键为1的书籍的出版社所在的城市
def query_book(request):book_obj = models.Book.objects.filter(pk=1).first()print(book_obj.publish.city)return HttpResponse("查询成功!")
- 反向
查询华山出版社出版的书籍名
def query_book(request):pub_obj = models.Publish.objects.filter(name="华山出版社").first()for book in pub_obj.book_set.all():print(book.title)return HttpResponse("查询成功!")
一对一的关系
反向时,直接小写的表名即可(不用_set)
- 正向
查询令狐冲的电话
def query_book(request):author_obj = models.Author.objects.filter(name="令狐冲").first()print(author_obj.au_detail.tel)return HttpResponse("查询成功!")
- 正向
查询所有住址在黑木崖的作者的姓名
def query_book(request):au_detail_obj = models.AuthorDetail.objects.filter(addr="黑木崖")for au in au_detail_obj:print(au.author.name)return HttpResponse("查询成功!")
多对多的关系
- 正向
查询独孤九剑所有作者的名字以及手机号
def query_book(request):book_obj = models.Book.objects.filter(title="独孤九剑").first()for au in book_obj.authors.all():print(au.name, au.au_detail.tel)return HttpResponse("查询成功!")
- 正向
查询令狐冲出过的所有书籍的名字
def query_book(request):au_obj = models.Author.objects.filter(name="令狐冲").first()for book in au_obj.book_set.all():print(book.title)return HttpResponse("查询成功!")
基于双下划线的跨表查询
一对多关系
查询华山出版社出版过的所有书籍的名字与价格(一对多)
- 正向
def query_book(request):book = models.Book.objects.filter(publish__name="华山出版社").values("title", "price")return HttpResponse("查询成功!")
- 反向
def query_book(request):book = models.Publish.objects.filter(name="华山出版社").values("book__title", "book__price")return HttpResponse("查询成功!")
多对多关系
查询令狐冲出过的所有书籍的名字(多对多)
- 正向
def query_book(request):book = models.Book.objects.filter(authors__name="令狐冲").values("title")return HttpResponse("查询成功!")
- 反向
def query_book(request):book = models.Author.objects.filter(name="令狐冲").values("book__title")return HttpResponse("查询成功!")
一对一关系
查询令狐冲的手机号
- 正向
def query_book(request):book = models.Author.objects.filter(name="令狐冲").values('au_detail__tel')return HttpResponse("查询成功!")
- 反向
def query_book(request):book = models.AuthorDetail.objects.filter(author__name="令狐冲").values('tel')return HttpResponse("查询成功!")
连续跨表
查询华山出版社出版过的所有书籍的名字以及作者的姓名
- 正向
def query_book(request):book = models.Book.objects.filter(publish__name="华山出版社").values('title', 'authors__name')return HttpResponse("查询成功!")
- 反向
def query_book(request):book = models.Publish.objects.filter(name="华山出版社").values("book__title", "book__authors__name")return HttpResponse("查询成功!")
Python笔记_50_ORM_多表操作相关推荐
- 【Python笔记】列表基础操作 :创建,增加、删除、查询。附加:练习题。用简单代码解释。
Python:列表基础操作 创建,增加.删除.查询.附加练习题.用简单代码解释. 目录 Python:列表基础操作 演示环境 第一部分:列表(list) 1. 创建空列表 2. 创建只有默认值的列表 ...
- Python笔记-U2控件操作和操作超时
以豌豆荚为例: 普通的操作: import uiautomator2 as u2d = u2.connect_usb("8681-A01-0xc60fcc9d") d.app_st ...
- 初学者python笔记(文件的操作)
当Python学到一定程度的时候,就要跟文件打交道了.到以后自己的写程序,对文件的操作是非常频繁的,因此学会对文件的操作也是Python学习的一项基础任务. 打开文件与读取文件 基本的打开操作 f = ...
- 【Python笔记】字符串常见操作
Python字符串常见操作 字符串的拼接 计算字符串的长度 截取字符串 分隔字符串 字符串的替换 字符串的检索 字符串大小写转换 去掉字符串中的空格和特殊字符 格式化字符串 字符串的拼接 字符串不允许 ...
- vba移动文件_VBA学习笔记8:工作表操作
学习资源:<Excel VBA从入门到进阶>第10集 by蓝色幻想 一.Excel工作表的分类 Excel工作表有两大类,一类是我们平常用的工作表(worksheet),另一类是图表.宏表 ...
- python io操作有什么_Python笔记:文件IO操作
读取文件 使用open()打开文件,文件不存在会抛出IOError错误. try: f = open('/path/to/file', 'r') print(f.read()) finally: if ...
- Hive学习笔记三之函数操作
文章目录 5 函数 5.1 系统内置函数 5.2 常用内置函数 5.2.1 空字段赋值 5.2.2 CASE WHEN THEN ELSE END(类似于java中的switch case) 5.2. ...
- Python笔记002-列表推导式
Python笔记002-列表推导式 以下是我学习<流畅的Python>后的个人笔记,现在拿出来和大家共享,希望能帮到各位Python学习者. 首次发表于: 微信公众号:科技老丁哥,ID: ...
- 【python MySQL 笔记】python和MySQL交互、操作
[python MySQL 笔记]python和MySQL交互.操作 目录 1. 数据准备 2. SQL演练 2.1 SQL语句强化练习 2.2. 将一个表拆为多个表 3. python操作MySQ ...
最新文章
- R语言绘图:28个实用程序包
- Windows Azure Storage – 4万亿对象和计数
- w3wp.exe内存占用过高(网站打不开,应用程序池回收就正常)
- android标题背景色,设置标题背景颜色
- java 设置光标_java光标位置怎么设置 java设置光标位置方法
- Hyperledger中数据存取的实现
- 三个数差的平方公式推导过程_万有引力常量反复测量不“常”咋回事?新常量公式诠释引力本质...
- 分享最新40款免费的 WordPress 主题(上篇)
- pythoncsv格式清洗与转换_数据预处理-清洗转换
- 性能测试工具JMeter的安装及环境配置--Windows和Linux
- 朴素版的Dijkstra算法
- sublime text3 炫酷主题
- 喝酒娱乐小游戏微信小程序源码
- c51单片机时钟程序汇编语言,51单片机时钟汇编程序
- 魏俊妮《如何成为支持业务的HR》课程大纲
- 网络管理人员应该掌握的技术
- WAP 构建 Java 应用 和 WAP经验总结
- Lync 客户端单独安装激活步骤
- n维椭球体积公式_为了方差无偏估计为什么要用n-1?
- python日志模块 超量处理_Python logging日志处理模块
热门文章
- python lambda是个啥
- Markdown链接采用新开窗口的方式打开
- 牛客暑假2020第二场C题,dfs+结论
- 动手打造个人Zfile开源网盘并反向代理域名访问
- 中小互联网软件公司的骗局--一个小型公司一连串的过家家似的政治斗争(1)
- i9 9900k mysql_Intel酷睿i9-9900K怎么样?
- 特洛伊木马大揭密(转)
- 智能座舱的“宏大蓝图”和“残酷现实”
- 城邦时代,百倍加速(一)
- 学计算机用商务本还是游戏本,学生党、游戏党、商务人士最实用的、高性价比笔记本电脑推荐!...