您可以使用 Django 的RelatedManager
:
“相关管理器”是在一对多或多对多相关上下文中使用的管理器。这发生在两种情况下:
ForeignKey 关系的“另一面”。那是:
class Reporter(models.Model):
...
class Article(models.Model):
reporter = models.ForeignKey(Reporter)
在上面的示例中,以下方法将在 manager 上可用reporter.article_set
。
ManyToManyField 关系的双方:
class Topping(models.Model):
...
class Pizza(models.Model):
toppings = models.ManyToManyField(Topping)
在此示例中,以下方法将在 ontopping.pizza_set
和 on 上都可用pizza.toppings
。
这些相关的管理器有一些额外的方法:
要创建新对象,请将其保存并放入相关对象集中。返回新创建的对象:create(**kwargs)
>>> b = Toy.objects.get(id=1)
>>> e = b.box_set.create(
... name='Hi',
... )
# No need to call e.save() at this point -- it's already been saved.
# OR:
>>> b = Toy.objects.get(id=1)
>>> e = Box(
... toy=b,
... name='Hi',
... )
>>> e.save(force_insert=True)
要将模型对象添加到相关对象集中:
add(obj1[, obj2, ...])
例子:
>>> t = Toy.objects.get(id=1)
>>> b = Box.objects.get(id=234)
>>> t.box_set.add(b) # Associates Box b with Toy t.
要从相关对象集中删除指定的模型对象:
remove(obj1[, obj2, ...])
>>> b = Toy.objects.get(id=1)
>>> e = Box.objects.get(id=234)
>>> b.box_set.remove(e) # Disassociates Entry e from Blog b.
为了防止数据库不一致,这个方法只存在于null=True的ForeignKey对象上。如果相关字段无法设置为无 (NULL),则无法从关系中删除对象而不将其添加到另一个对象。在上面的例子中,从 b.entry_set() 中去掉 e 就相当于做 e.blog = None,并且因为博客 ForeignKey 没有 null=True,所以这是无效的。
从相关对象集中删除所有对象:clear()
>>> b = Toy.objects.get(id=1)
>>> b.box_set.clear()
请注意,这不会删除相关对象——它只是解除它们的关联。就像 remove() 一样,clear() 仅在 null=True 的 ForeignKeys 上可用。
参考:有关处理相关对象的相关 Django 文档