一、class RelatedManager

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

  1、一对多

    ForeignKey关系的“另一边”。像这样:

1
2
3
4
5
6
7
from django.db import models
  
class Publish(models.Model):
    pass
  
class Book(models.Model):
    publish = models.ForeignKey("Publish", on_delete=models.CASCADE)

    在上面的例子中,管理器publish_obj.book_set  会拥有下面介绍的方法。

  2、多对多

    ManyToManyField关系的两边:

1
2
3
4
5
6
class Author(models.Model):
    pass
 
 
class Book(models.Model):
    authors = models.ManyToManyField("Author")

    在这个例子中,book_obj.authors 和author_obj.book_set 都拥有下面的方法。

  3、方法合集

    1、add(obj1[, obj2, ...])
把指定的模型对象添加到关联对象集中。

例如:

>>> author_obj = Author.objects.get(id=1)
>>> book_obj = Book.objects.get(id=2)
>>> author_obj .book_set.add(e)
在上面的例子中,对于ForeignKey关系,book_obj.save()由关联管理器调用,执行更新操作。然而,在多对多关系中使用add()并不会调用任何 save()方法,而是由QuerySet.bulk_create()创建关系。 延伸: # 1 *[]的使用
>>> book_obj = Book.objects.get(id=1)
>>> author_list = Author.objects.filter(id__gt=2)
>>> book_obj.authors.add(*author_list) # 2 直接绑定主键
book_obj.authors.add(*[1,3]) # 将id=1和id=3的作者对象添加到这本书的作者集合中
# 应用: 添加或者编辑时,提交作者信息时可以用到.
    2、create(**kwargs)
创建一个新的对象,保存对象,并将它添加到关联对象集之中。返回新创建的对象:

>>> author_obj = Author.objects.get(id=1)
>>> book = author_obj.book_set.create(
...
title='挤奶龙爪手',
...
) # No need to call e.save() at this point -- it's already been saved.
这完全等价于(不过更加简洁于): >>> author_obj = Author.objects.get(id=1)
>>> book = Book(
...
title='挤奶龙爪手',
...
)
>>> author_obj.save(force_insert=True)
要注意我们并不需要指定模型中用于定义关系的关键词参数。在上面的例子中,我们并没有传入author_obj参数给create()。Django会明白新的 Book对象author_obj 应该添加到author_obj中。
    3、remove(obj1[, obj2, ...])
从关联对象集中移除执行的模型对象:

>>> author_obj = Author.objects.get(id=1)
>>> book_obj = Book.objects.get(id=2)
>>> author_obj .book_set.remove(book_obj)
对于ForeignKey对象,这个方法仅在null=True时存在。
    4、clear()
从关联对象集中移除一切对象。

>>> author_obj = Author.objects.get(id=1)
>>> author_obj.book_set.clear()
注意这样不会删除对象 —— 只会删除他们之间的关联。 就像 remove() 方法一样,clear()只能在 null=True的ForeignKey上被调用。
    5、set()方法

    先清空,在设置,编辑书籍时即可用到。

book = models.Book.objects.filter(title="独孤九剑").first()
book.authors.set([1, 3])  

注意:

对于所有类型的关联字段,add()、create()、remove()和clear(),set()都会马上更新数据库。换句话说,在关联的任何一端,都不需要再调用save()方法。

最新文章

  1. SQL--局部变量
  2. 文件与base64二进制转换
  3. abstract 类 构造函数
  4. ISODATA算法
  5. 自定义input file 属性
  6. mysql table readonly
  7. js 中对象的特性
  8. jquery ajax异步调用
  9. ThinkSNS+ alpha.2 版本发布,功能抢先看!【社交系统研发日记六】
  10. LeetCode & Q35-Search Insert Position-Easy
  11. 五一之起一台服务器玩玩-centosl系统搭建lamp
  12. 实现鼠标悬停,div勾画div边框的动画
  13. C 逻辑运算, 移位运算 , 取整 , 取模(取余)
  14. soundJs库简单使用心得
  15. 小项目分析之C++ 实现模拟银行排队
  16. bootstrap 强调相关的类
  17. 从n个元素中选择k个的所有组合(包含重复元素)
  18. CefGlue在WinXP下闪退的排查方法
  19. C# 装箱
  20. Sphinx/Coreseek 4.1的安装流程

热门文章

  1. 解决fatal error LNK1168的终极方法
  2. CORS 实战 专题
  3. HTML基础篇(标签和属性整--已剔除不被浏览器支持的部分)
  4. Java之增强的for 循环
  5. Python定时任务
  6. java中读取配置文件ResourceBundle和Properties两种方式比较
  7. BZOJ_5118_Fib数列2_矩阵乘法+欧拉定理
  8. BZOJ_3011_[Usaco2012 Dec]Running Away From the Barn _可并堆
  9. JVM内存异常与常用内存参数设置总结
  10. 去除vue项目中的#及其ie9兼容性