类RelateManager
一个'related manager'是一个用于在一对多,或者多对多的关联上下文中的管理器,例如在下面的两个情况下:
(1)。另一边的外键关联,如:
class Reporter(models.Model): // ... class Article(models.Model): // reporter = models.ForeignKey(Reporter)
在上面的例子中,下面的方法在reporter.article_set 管理器中可用。
(2)两边都有的多对的关联:
class Topping(model.Model): // ... class Pizza(model.Model): toppings = models.ManyToManyField(Topping) // ...
在这个例子当中,下面的方法在topping.pizza_set 和pizza.toppings中都可用。
关联管理器有如下的额外方法:
(1) add(obj[,obj2,...])
将指定的模型对象添加到相关联对象集。
例如:
b = Blog.objects.get(id=1) e = Entry.objects.get(id=234) b.entry_set.add(e) # associates entry a with blog b
(2)create(**kwargs)
创建一个新的对象,保存到关联对象集中,返回最新创建的对象。
b = Blog.objects.get(id=1) c = Entry( blog=b, headline='Hello', body_text='Hi', pub_date=datatime.date(2005,1,1) ) e.save(force_insert=True)
注意,在定义关联时不需要指定模型的关键字,在上面的示例中,我们没有传递参数blog给create()。Django识别出新的Entry对象的blog字段应该被设置成b。
3.remove(obj1[,obj2,...])
从关联集中删除指定的模型对象
b = Blog.objects.get(id=1) e = Entry.objects.get(id=234) b.entry_set.remove(e) # disassociates Entry e form blog b
为了防止数据库不一致,这个方法仅仅存在于null=True的ForeignKey对象中。如果关联字段不能设置为None(NULL),
那么一个对象不能在没有添加到别一个时从一个关联中删除。在上面的示例中,从b.entry_set()删除e,相当于
e.blog = None,并且因为blog ForeignKey并没有null=True的属性,这是非法的。。
4.clear()
从关联对象集中删除所有对象。
b = Blog.objects.get(id=1) b.entry_set.clear()
注意这并没有删除关联对象,它只是取消他们的关联。
如remove(),clear()只是在当null=True在ForeignKey时可用。