class Toy(models.Model):
name = models.CharField(max_length=20)
desc = models.TextField()
class Box(models.Model):
name = models.CharField(max_length=20)
proprietor = models.ForeignKey(User, related_name='User_Box')
toys = models.ManyToManyField(Toy, blank=True)
如何创建将玩具添加到Box的视图?
def add_this_toy_to_box(request, toy_id):
答案 0 :(得分:7)
您可以使用Django的RelatedManager
:
“相关经理”是在一对多或多对多相关背景中使用的经理。这种情况发生在两种情况下:
ForeignKey关系的“另一面”。那就是:
class Reporter(models.Model):
...
class Article(models.Model):
reporter = models.ForeignKey(Reporter)
在上面的示例中,以下方法将在经理
reporter.article_set
上提供。ManyToManyField关系的两端:
class Topping(models.Model):
...
class Pizza(models.Model):
toppings = models.ManyToManyField(Topping)
在此示例中,以下方法将在
topping.pizza_set
和pizza.toppings
上提供。
这些相关经理有一些额外的方法:
要创建新对象,请将其保存并将其放入相关对象集中。返回新创建的对象: 创建(** 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对象上。如果相关字段不能设置为None(NULL),则无法从关系中删除对象而不将其添加到另一个关联。在上面的示例中,从b.entry_set()中删除e等同于执行e.blog = None,并且因为博客ForeignKey没有null = True,所以这是无效的。
从相关对象集中删除所有对象: 清晰()
>>> b = Toy.objects.get(id=1)
>>> b.box_set.clear()
请注意,这不会删除相关对象 - 它只会取消它们的关联。 就像remove()一样,clear()仅在ForeignKeys上可用,其中null = True。
答案 1 :(得分:2)
Django会自动在ManyToManyFields上创建反向关系,所以你可以这样做:
toy = Toy.objects.get(id=toy_id)
toy.box_set.add(box)