关联对象参考

2018-05-21  本文已影响15人  SingleDiego

官方文档

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

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_setpizza.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)
上一篇 下一篇

猜你喜欢

热点阅读