"关联管理器"是在一对多或者多对多的关联上下文中使用的管理器。它存在于下面两种状况:python
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(Reporter)
|
在上面的例子中,管理器reporter.article_set拥有下面的方法。django
ManyToManyField关系的两边:sass
1
2
3
4
5
6
|
class
Topping(models.Model):
# ...
pass
class
Pizza(models.Model):
toppings
=
models.ManyToManyField(Topping)
|
这个例子中,topping.pizza_set 和pizza.toppings都拥有下面的方法。this
add(obj1[, obj2, ...])spa
把指定的模型对象添加到关联对象集中。 例如: >>> b = Blog.objects.get(id=1) >>> e = Entry.objects.get(id=234) >>> b.entry_set.add(e) # Associates Entry e with Blog b. 在上面的例子中,对于ForeignKey关系,e.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)code
建立一个新的对象,保存对象,并将它添加到关联对象集之中。返回新建立的对象: >>> b = Blog.objects.get(id=1) >>> e = b.entry_set.create( ... headline='Hello', ... body_text='Hi', ... pub_date=datetime.date(2005, 1, 1) ... ) # No need to call e.save() at this point -- it's already been saved. 这彻底等价于(不过更加简洁于): >>> b = Blog.objects.get(id=1) >>> e = Entry( ... blog=b, ... headline='Hello', ... body_text='Hi', ... pub_date=datetime.date(2005, 1, 1) ... ) >>> e.save(force_insert=True) 要注意咱们并不须要指定模型中用于定义关系的关键词参数。在上面的例子中,咱们并无传入blog参数给create()。Django会明白新的 Entry对象blog 应该添加到b中。
remove(obj1[, obj2, ...])对象
从关联对象集中移除执行的模型对象: >>> b = Blog.objects.get(id=1) >>> e = Entry.objects.get(id=234) >>> b.entry_set.remove(e) # Disassociates Entry e from Blog b. 对于ForeignKey对象,这个方法仅在null=True时存在。
clear()blog
从关联对象集中移除一切对象。 >>> b = Blog.objects.get(id=1) >>> b.entry_set.clear() 注意这样不会删除对象 —— 只会删除他们之间的关联。 就像 remove() 方法同样,clear()只能在 null=True的ForeignKey上被调用。
set()方法ci
先清空,在设置,编辑书籍时便可用到
注意
对于全部类型的关联字段,add()、create()、remove()和clear(),set()都会立刻更新数据库。换句话说,在关联的任何一端,都不须要再调用save()方法。
直接赋值:
经过赋值一个新的可迭代的对象,关联对象集能够被总体替换掉。
1
2
|
>>> new_list
=
[obj1, obj2, obj3]
>>> e.related_set
=
new_list
|
若是外键关系知足null=True,关联管理器会在添加new_list中的内容以前,首先调用clear()方法来解除关联集中一切已存在对象的关联。不然, new_list中的对象会在已存在的关联的基础上被添加。