文章目录

  • 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()方法。

基于对象的跨表查询

正向>>
>>
<<反向
<<
Book
字段名称
Publish
小写表名+_set
一对多关系
  • 正向
    查询主键为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("查询成功!")

基于双下划线的跨表查询

正向>>
>>
<<反向
<<
Book
字段名称__跨表的字段名称
Publish
小写表名__跨表的字段名称
一对多关系

查询华山出版社出版过的所有书籍的名字与价格(一对多)

  • 正向
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_多表操作相关推荐

  1. 【Python笔记】列表基础操作 :创建,增加、删除、查询。附加:练习题。用简单代码解释。

    Python:列表基础操作 创建,增加.删除.查询.附加练习题.用简单代码解释. 目录 Python:列表基础操作 演示环境 第一部分:列表(list) 1. 创建空列表 2. 创建只有默认值的列表 ...

  2. Python笔记-U2控件操作和操作超时

    以豌豆荚为例: 普通的操作: import uiautomator2 as u2d = u2.connect_usb("8681-A01-0xc60fcc9d") d.app_st ...

  3. 初学者python笔记(文件的操作)

    当Python学到一定程度的时候,就要跟文件打交道了.到以后自己的写程序,对文件的操作是非常频繁的,因此学会对文件的操作也是Python学习的一项基础任务. 打开文件与读取文件 基本的打开操作 f = ...

  4. 【Python笔记】字符串常见操作

    Python字符串常见操作 字符串的拼接 计算字符串的长度 截取字符串 分隔字符串 字符串的替换 字符串的检索 字符串大小写转换 去掉字符串中的空格和特殊字符 格式化字符串 字符串的拼接 字符串不允许 ...

  5. vba移动文件_VBA学习笔记8:工作表操作

    学习资源:<Excel VBA从入门到进阶>第10集 by蓝色幻想 一.Excel工作表的分类 Excel工作表有两大类,一类是我们平常用的工作表(worksheet),另一类是图表.宏表 ...

  6. python io操作有什么_Python笔记:文件IO操作

    读取文件 使用open()打开文件,文件不存在会抛出IOError错误. try: f = open('/path/to/file', 'r') print(f.read()) finally: if ...

  7. Hive学习笔记三之函数操作

    文章目录 5 函数 5.1 系统内置函数 5.2 常用内置函数 5.2.1 空字段赋值 5.2.2 CASE WHEN THEN ELSE END(类似于java中的switch case) 5.2. ...

  8. Python笔记002-列表推导式

    Python笔记002-列表推导式 以下是我学习<流畅的Python>后的个人笔记,现在拿出来和大家共享,希望能帮到各位Python学习者. 首次发表于: 微信公众号:科技老丁哥,ID: ...

  9. 【python MySQL 笔记】python和MySQL交互、操作

    [python MySQL 笔记]python和MySQL交互.操作 目录 1. 数据准备 2.  SQL演练 2.1 SQL语句强化练习 2.2. 将一个表拆为多个表 3. python操作MySQ ...

最新文章

  1. R语言绘图:28个实用程序包
  2. Windows Azure Storage – 4万亿对象和计数
  3. w3wp.exe内存占用过高(网站打不开,应用程序池回收就正常)
  4. android标题背景色,设置标题背景颜色
  5. java 设置光标_java光标位置怎么设置 java设置光标位置方法
  6. Hyperledger中数据存取的实现
  7. 三个数差的平方公式推导过程_万有引力常量反复测量不“常”咋回事?新常量公式诠释引力本质...
  8. 分享最新40款免费的 WordPress 主题(上篇)
  9. pythoncsv格式清洗与转换_数据预处理-清洗转换
  10. 性能测试工具JMeter的安装及环境配置--Windows和Linux
  11. 朴素版的Dijkstra算法
  12. sublime text3 炫酷主题
  13. 喝酒娱乐小游戏微信小程序源码
  14. c51单片机时钟程序汇编语言,51单片机时钟汇编程序
  15. 魏俊妮《如何成为支持业务的HR》课程大纲
  16. 网络管理人员应该掌握的技术
  17. WAP 构建 Java 应用 和 WAP经验总结
  18. Lync 客户端单独安装激活步骤
  19. n维椭球体积公式_为了方差无偏估计为什么要用n-1?
  20. python日志模块 超量处理_Python logging日志处理模块

热门文章

  1. python lambda是个啥
  2. Markdown链接采用新开窗口的方式打开
  3. 牛客暑假2020第二场C题,dfs+结论
  4. 动手打造个人Zfile开源网盘并反向代理域名访问
  5. 中小互联网软件公司的骗局--一个小型公司一连串的过家家似的政治斗争(1)
  6. i9 9900k mysql_Intel酷睿i9-9900K怎么样?
  7. 特洛伊木马大揭密(转)
  8. 智能座舱的“宏大蓝图”和“残酷现实”
  9. 城邦时代,百倍加速(一)
  10. 学计算机用商务本还是游戏本,学生党、游戏党、商务人士最实用的、高性价比笔记本电脑推荐!...