[英]Many to many relation. ORM Django
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):
你可以使用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)
在此示例中,以下方法將在
topping.pizza_set
和pizza.toppings
上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對象上。 如果相關字段不能設置為None(NULL),則無法從關系中刪除對象而不將其添加到另一個關聯。 在上面的示例中,從b.entry_set()中刪除e等同於執行e.blog = None,並且因為博客ForeignKey沒有null = True,所以這是無效的。
從相關對象集中刪除所有對象:clear()
>>> b = Toy.objects.get(id=1) >>> b.box_set.clear()
請注意,這不會刪除相關對象 - 它只是將它們取消關聯。 就像remove()一樣,clear()僅在ForeignKeys上可用,其中null = True。
Django會自動在ManyToManyFields上創建反向關系,因此您可以:
toy = Toy.objects.get(id=toy_id)
toy.box_set.add(box)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.