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=‘太亮的产后护理‘)

原文地址:https://www.cnblogs.com/kenD/p/10079700.html

时间: 2024-11-09 07:18:53

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

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

class RelatedManager "关联管理器"是在一对多或者多对多的关联上下文中使用的管理器.它存在于下面两种情况: ForeignKey关系的“另一边”.像这样: 1 2 3 4 5 6 7 8 from django.db import models class Reporter(models.Model):     # ...     pass class Article(models.Model):     reporter = models.ForeignKey(R

关联管理器(RelatedManager)

一.class RelatedManager "关联管理器"是在一对多或者多对多的关联上下文中使用的管理器.它存在于下面两种情况: 1.一对多 ForeignKey关系的“另一边”.像这样: from django.db import models class Publish(models.Model): pass class Book(models.Model): publish = models.ForeignKey("Publish", on_delete=m

[Django]orm中的外键级联删除

这里的系统环境为django1.6   os为win7 今天有个需求说的是添加一个地区表,然后用外键和几个非常重要的实体表来做关联(地区表作为其他表的外键),写完地区的删除操作的时候,测试了下代码,功能正常.可是眼睛移动到控制台输出的时候傻了 connexesql ->DELETE FROM `mngm_device` WHERE `mngm_device`.`area_id` IN (%s, %s, %s) connexesql ->DELETE FROM `ad_ad` WHERE `ad

django orm中 get 与filter的区别

django orm中 get 与filter的区别: 以前误以为get与filter的区别仅仅是filter返回多条,而get仅支持一条记录,直到使用related_name属性 才发现,两者的差异远不止如此,最本质的区别是 filter返回的值是一个queryset对象, 而get 返回值是一个定义的model对象, 使用get 返回的结果去访问子表对象可以成功,而使用filter就会出错, 是因为queryset 对象没有realtaed_name属性,无法回溯到子表

django ORM中的复选MultiSelectField的使用

在django ORM的使用中,经常会出现选择的情况,例如: class person(odels.Model): sex_type = (('male',u'男'), ('female',u'女')) sex = models.CharField(u"性别", choices=sex_type,max_length=32) 但并不是所有的选择都是只有一个结果的,例如 class person(odels.Model): language_choices= (('chinese',u'

django ORM中的表关系

多对一: 为了方便理解,两个表之间使用ForeignKey连接时,使用ForeignKey的字段所在的表为从表,被ForeignKey连接的表为主表. 使用场景:书和出版社之间的关系,一本书只能由一个出版社出版,一个出版社却可以出版很多书 实现方式:一对多或者说多对一,在Django中是使用ForeignKey实现的,下面是例子: class Publisher(models.Model): id = models.AutoField(primary_key=True) name = model

Django ORM中常用字段和参数

Django ORM 常用字段和参数 常用字段 AutoField int自增列,必须填入参数primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. IntegerField 一个整数类型,范围在 -2147483648 to 2147483647.(一般不用它来存手机号(位数也不够),直接用字符串存,) CharField 字符类型,必须提供max_length参数, max_length表示字符长度. 这里需要知道的是Django中的CharFiel

django ORM中models的字段以及参数

字段: AutoField(Field)         - int自增列,必须填入参数 primary_key=True     BigAutoField(AutoField)         - bigint自增列,必须填入参数 primary_key=True         注:当model中如果没有自增列,则自动会创建一个列名为id的列         from django.db import models         class UserInfo(models.Model):

android中常用的布局管理器

Android中的几种常用的布局,主要介绍内容有: View视图 RelativeLayout    相对布局管理器 LinearLayout     线性布局管理器 FrameLayout     真布局管理器 TableLayout     表格布局管理器 GridLayout     网格布局管理器 (1) View在XML文件中的常用属性定义: layout_margin:指定该视图与周围视图之间的空白距离(包括上下左右),(可分别写成layout_marginTop.layout_ma