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
。
これらの関連するマネージャーには、いくつかの追加のメソッドがあります。
新しいオブジェクトを作成するには、それを保存して関連オブジェクト セットに入れます。新しく作成されたオブジェクトを返します: 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() は null=True の ForeignKey でのみ使用できます。
参照:関連オブジェクトの処理に関する関連 Django ドキュメント