• django ORM中的RelatedManager(关联管理器)


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

    多对多表中的用法:

    在多对多的表中 正向查询 

    #基于对象的查询
    #正查
    # 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='太亮的产后护理')
  • 相关阅读:
    实际成本法
    加权平均法,移动加权平均法,先进先出法(计算策略)
    xss缺陷--脚本语言嵌入漏洞
    关于耳机插入,设备管理中:声音设置中却显示"没有耳机插入"
    国家十二类稀缺人才
    apache2.4搭建php5.53问题总结
    任意多个有序结合求交集
    类似于大数相加的一个题
    数字的最大组合
    计算二叉树每层的和
  • 原文地址:https://www.cnblogs.com/kenD/p/10079700.html
Copyright © 2020-2023  润新知