关联管理器应用在 一对多的表 或者 多对多的表
多对多表中的用法:
在多对多的表中 正向查询
#基于对象的查询 #正查 # 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='太亮的产后护理')