关联管理器 是在一对多或者多对多的关联上下文中使用的管理器。它存在于下面两种情况。
ForeignKey
关系中:
from django.db import models
class Reporter(models.Model):
name = models.CharField(max_length=50)
class Article(models.Model):
title = models.CharField(max_length=50)
reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)
在上面的例子中,Django 为我们自动生成了 reporter.article_set
管理器,可以实现子表对母表的关联管理,都将拥有以下方法。
ManyToManyField
关系中:
from django.db import models
class Topping(models.Model):
food = models.CharField(max_length=50)
def __str__(self):
return self.name
class Pizza(models.Model):
name = models.CharField(max_length=50)
toppings = models.ManyToManyField(Topping)
def __str__(self):
return self.name
这个例子中,topping.pizza_set
和 pizza.toppings
两个管理器都将拥有以下方法。
add(*objs, bulk=True)
添加一指定的模型对象到关联的对象集中。
# ManyToManyField 关系
# 把一个子表对象添加到母表对象的关联中
p = Pizza.objects.get(pk=2)
t = Topping.objects.get(pk=1)
t.pizza_set.add(p)
在上述示例中,在 ForeignKey
关系的情况下,使用 QuerySet.update()
来执行更新。 它要求对象已经被保存,例如:
r = Reporter.objects.get(pk=1)
a = Article.objects.filter(pk=2)
a.update(reporter=r)
create(**kwargs)
# 为子表对象创建一个关联的母表对象
r = Reporter.objects.get(pk=1)
r.article_set.create(title='文章a')
这等价于:
r = Reporter.objects.get(pk=1)
a = Article(
title = '文章a',
reporter = r
)
a.save(force_insert=True)
remove(*objs)
# 把子表对象从母表对象的关联中移除
p = Pizza.objects.get(pk=2)
t = Topping.objects.get(pk=1)
t.pizza_set.remove(p)
clear()
# 把子表对象的所有和母表关联移除
# 现在所有 pizza 都不包含这个 topping
p = Pizza.objects.get(pk=2)
t = Topping.objects.get(pk=1)
t.pizza_set.clear()
set(objs, bulk=True, clear=False)
# 把子表对象同时添加到几个母表对象的关联中
# p2,p3 两个 pizza 对象都会拥有 t 这个 topping
p2 = Pizza.objects.get(pk=2)
p3 = Pizza.objects.get(pk=3)
p_list = [p2, p3]
t = Topping.objects.get(pk=1)
t.pizza_set.set(p_list)
网友评论