关联管理器应用在 一对多的表 或者 多对多的表

多对多表中的用法:

在多对多的表中 正向查询

#基于对象的查询
#正查
# author_obj = Author.objects.get(id=1)
# print(author_obj) #<Author object: 1 吴晓波>
# print(author_obj.book_set.all()) #出版过的所有的书 <QuerySet [<Book: 小王子>, <Book: 哈利波特>]>

在反向查询中会有用到关联管理器

#反向
# book_obj = Book.objects.get(id=1)
# print(book_obj) #小王子 #联合出版小王子这本书的所有作者
# print(book_obj.author.all())
#<QuerySet [<Author: <Author object: 1 吴晓波>>, <Author: <Author object: 3 俞敏洪>>]> # 设置多对多关系
# author_obj = Author.objects.get(id=1) ##<Author object: 1 吴晓波>
# author_obj.book_set.set([4,5]) # 要关联对象的ID [ 对象的id,对象的id]
# 把书籍id=4 和 书籍id=5 的跟author id=1的绑定在一起, author id=1之前绑定的给清除了
# print(author_obj.book_set.all()) # author_obj.book_set.set(Book.objects.all())
# print(author_obj.book_set.all()) #把所有的书籍都跟author id=1的给绑定 # 添加多对多的关系
# author_obj = Author.objects.get(id=2) #author id = 2的
# author_obj.book_set.add(3) # 要关联对象的ID 直接通过id找对象就类似于学生的学号,但是不确定这个学生到底在不在
# 类似于反向查询 在book表中找到 book id=3 的跟author id=2 的绑定
# print(author_obj.book_set.all()) # author_obj = Author.objects.get(id=2) #author id = 2的
# author_obj.book_set.add(Book.objects.get(id=2)) # 要关联对象
# #这种方法就类似于直接找到学生 再把学生叫过来 然后绑定关系
# print(author_obj.book_set.all()) # 删除多对多关系
# author_obj = Author.objects.get(id=1)
# author_obj.book_set.remove(1) # 要关联对象的id
# # 找到book表中id=1 的 删除和author id=1 之间的关系
# print(author_obj.book_set.all()) # author_obj = Author.objects.get(id=1)
# author_obj.book_set.remove(Book.objects.get(id=2)) # 要关联对象
# # 把book表中的对象找出来 然后处理和author的关系
# print(author_obj.book_set.all()) # 清空当前对象的多对多的关系
# author_obj = Author.objects.get(id=1)
# author_obj.book_set.clear() #解除所有的绑定关系
# print(author_obj.book_set.all()) #创建一条多对多的关系 create()
author_obj = Author.objects.get(id=1)
author_obj.book_set.create(title='太亮教抛光',price=50)
print(author_obj.book_set.all())

多对一表中的用法:

#基于对象的查询   正向查询
book_obj = models.Book.objects.get(id=1) #拿到第一个book对象
# print(book_obj) # <Book object: 1 小王子>
# print(book_obj.title) # 小王子
# print(book_obj.publisher) #正查按字段 书的出版社 沙河出版社
# print(book_obj.publisher_id) #这本书对应的出版社的id 1
#  反向查询
# pub_obj = models.Publisher.objects.get(id=3)
# print(pub_obj.name) #人民出版社 # 反向查询 查询出版社出的所有书籍
# ret = pub_obj.book_set.all()
# print(ret)
# <QuerySet [<Book: 解忧杂货普>, <Book: 精进>]> # ret = pub_obj.books.all() # related_name='books' 反向查询时使用 不用再用表名小写_set了
# print(ret) #<QuerySet [<Book: 解忧杂货普>, <Book: 精进>]> # 基于字段的查询
# 查沙河出版社出版的书
# ret = models.Book.objects.filter(publisher__name="沙河出版社")
# print(ret) # ret = Book.objects.filter(publisher__name="沙河出版社") #找 精进这本书 的出版社是哪个 反查 指定了related_name='books'
# ret = Publisher.objects.filter(books__title="精进") #不指定related_name
# ret = Publisher.objects.filter(book__title="精进")
# print(ret) # Django ORM 之 关联管理器(RelatedManager) *********
# “关联管理器”是在一对多或者多对多的关联上下文中使用的管理器
# 对于ForeignKey对象,这个方法仅在null=True时存在
# 外键字段可以为null 才有remove和clear 只能写对象
# 外键 在Book 表中
# id为1的出版社 出版过的书籍
pub_obj = Publisher.objects.get(id=1)
print(pub_obj.book_set.all()) #<QuerySet [<Book: 小王子>, <Book: 三国>]> # 从关联对象集中移除执行的模型对象 remove(一个对象)
ret = pub_obj.book_set.remove(Book.objects.get(id=1))
print(ret) pub_obj.books.clear() pub_obj.books.create(title='太亮的产后护理')

django ORM中的RelatedManager(关联管理器)的更多相关文章

  1. Django基础五之django模型层之关联管理器

    class RelatedManager "关联管理器"是在一对多或者多对多的关联上下文中使用的管理器.它存在于下面两种情况: ForeignKey关系的“另一边”.像这样: 1 ...

  2. 9 关联管理器(RelatedManager)

    知识预览: class RelatedManager class RelatedManager "关联管理器"是在一对多或者多对多的关联上下文中使用的管理器.它存在于下面两种情况: ...

  3. day 57 Django基础五之django模型层之关联管理器

    Django基础五之django模型层之关联管理器   class RelatedManager "关联管理器"是在一对多或者多对多的关联上下文中使用的管理器.它存在于下面两种情况 ...

  4. 第二十一篇 关联管理器(RelatedManager)

    关联管理器(RelatedManager) lass RelatedManager "关联管理器"是在一对多或者多对多的关联上下文中使用的管理器.它存在于下面两种情况: Forei ...

  5. Django ORM中常用字段和参数

    一些说明: 表myapp_person的名称是自动生成的,如果你要自定义表名,需要在model的Meta类中指定 db_table 参数,强烈建议使用小写表名,特别是使用MySQL作为后端数据库时. ...

  6. WEB框架-Django框架学习-关联管理器(RelatedManager)

    一.class RelatedManager "关联管理器"是在一对多或者多对多的关联上下文中使用的管理器.它存在于下面两种情况: 1.一对多 ForeignKey关系的“另一边” ...

  7. 关联管理器(RelatedManager)

    一.class RelatedManager "关联管理器"是在一对多或者多对多的关联上下文中使用的管理器.它存在于下面两种情况: 1.一对多 ForeignKey关系的“另一边” ...

  8. 优化Django ORM中的性能问题(含prefetch_related 和 select_related)

    Django是个好工具,使用的很广泛. 在应用比较小的时候,会觉得它很快,但是随着应用复杂和壮大,就显得没那么高效了.当你了解所用的Web框架一些内部机制之后,才能写成比较高效的代码. 怎么查问题 W ...

  9. django ORM中的复选MultiSelectField的使用

    下载和介绍: https://pypi.org/project/django-multiselectfield/ 在django ORM的使用中,经常会出现选择的情况,例如: class person ...

随机推荐

  1. Lexer的设计--上(3)

    lexer的构造函数 有了上一节Token做铺垫, 可以开始设计lexer, 首先应该想到的是, 源代码是以文件流的格式传到编译器中的, 所以作为编译器的前段的第一个阶段, lexer必须负责处理输入 ...

  2. 分布式文件系统的比较,115网盘用了fastdfs

    分布式文件系统 分布式文件系统,作为网盘的基础,应用底层文件管理.而分布式文件系统之上,用户文件的权限,用户目录管理都是由非分布式文件系统管理. 分布式文件系统需要关心的主要内容: 文件分布/数据分布 ...

  3. C#如何将十六进制数字符串转byte[]?

    代码: /// <summary> /// 16进制原码字符串转字节数组 /// </summary> /// <param name="hexString&q ...

  4. sql语句查询重复值

    select * from user where name in (select name from user group by name having count(*)>1)

  5. eclipse 插件编写(四)

    前言 前面几篇文章讲了下如果编写简单的eclipse插件,如创建插件项目.编写右键弹出菜单等功能,接下来主要写一下如何生成代码的功能,这一片的功能跟插件本身的编写关联不太大,主要处理插件之后的业务内容 ...

  6. Windows 各种计时函数总结(QueryPerformanceCounter可以达到微秒)

    本文对Windows平台下常用的计时函数进行总结,包括精度为秒.毫秒.微秒三种精度的5种方法.分为在标准C/C++下的二种time()及clock(),标准C/C++所以使用的time()及clock ...

  7. 大神为你分析 Go、Java、C 等主流编程语言(Go可以替代Java,而且最小化程序员的工作量,学习比较容易)

    本文主要分析 C.C++98.C++11.Java 与 Go,主要论述语言的关键能力.在论述的过程中会结合华为各语言编程专家和华为电信软件内部的骨干开发人员的交流,摒弃语言偏好或者语言教派之争,尽量以 ...

  8. Qt 之 样式表的使用——样式选择器(上下篇,很详细)

    http://blog.csdn.net/goforwardtostep/article/details/60884870 http://blog.csdn.net/goforwardtostep/a ...

  9. SQL基础复习2

    一.视图 1.创建视图      创建视图后加 WITH CHECK OPTION 2.视图查询 数据库系统的处理方法: 视图消解法(View Resolution) 步骤: 进行有效性检查-> ...

  10. 如何保证MQ消息必达

    此文章属于笔记,原属58沈剑 一.MQ消息必达,架构上的两个核心设计点: 消息落地 消息超时.重传.确认 四大部件:发送端 接收端 服务端 固化存储组成 二.上半场消息必达以及消息重复问题 上半场的流 ...