3
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)

Toy を Box に追加するビューを作成するには?

def add_this_toy_to_box(request, toy_id):
4

2 に答える 2

7

Django を使用できますRelatedManager:

「関連マネージャー」は、1 対多または多対多の関連コンテキストで使用されるマネージャーです。これは、次の 2 つの場合に発生します。

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

これらの関連するマネージャーには、いくつかの追加のメソッドがあります。

  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() は null=True の ForeignKey でのみ使用できます。


参照:関連オブジェクトの処理に関する関連 Django ドキュメント

于 2012-09-27T01:02:32.147 に答える
2

Django は ManyToManyFields で逆の関係を自動的に作成するため、次のことができます。

toy = Toy.objects.get(id=toy_id)
toy.box_set.add(box)
于 2012-09-26T23:26:25.273 に答える