簡體   English   中英

多對多的關系。 ORM Django

[英]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_setpizza.toppingspizza.toppings

這些相關經理有一些額外的方法:

  1. 要創建新對象,請將其保存並將其放入相關對象集中。 返回新創建的對象: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) 
  2. 要將模型對象添加到相關對象集:

     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. 
  3. 要從相關對象集中刪除指定的模型對象:

     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,所以這是無效的。

  4. 從相關對象集中刪除所有對象:clear()

     >>> b = Toy.objects.get(id=1) >>> b.box_set.clear() 

    請注意,這不會刪除相關對象 - 它只是將它們取消關聯。 就像remove()一樣,clear()僅在ForeignKeys上可用,其中null = True。


參考: 關於處理相關對象的相關Django文檔

Django會自動在ManyToManyFields上創建反向關系,因此您可以:

toy = Toy.objects.get(id=toy_id)
toy.box_set.add(box)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM