关联管理器(RelatedManager)

1、class RelatedManager

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

  一、一对多

    ForeignKey关系的“另外一边”。像这样:数据库

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  会拥有下面介绍的方法。django

  二、多对多

    ManyToManyField关系的两边:this

class Author(models.Model):
    pass


class Book(models.Model):
    authors = models.ManyToManyField("Author")

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

  三、方法合集

    一、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的做者对象添加到这本书的做者集合中
                              # 应用: 添加或者编辑时,提交做者信息时能够用到.
    二、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中。
    三、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时存在。
    四、clear()
从关联对象集中移除一切对象。

>>> author_obj = Author.objects.get(id=1)
>>> author_obj.book_set.clear()
注意这样不会删除对象 —— 只会删除他们之间的关联。

就像 remove() 方法同样,clear()只能在 null=True的ForeignKey上被调用。
    五、set()方法

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

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

注意:对象

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

相关文章
相关标签/搜索