27

次の関連モデルを使用します (1 つのブログ エントリに複数のリビジョンを含めることができます)。

class BlogEntryRevision(models.Model):
    revisionNumber = models.IntegerField()
    title = models.CharField(max_length = 120)
    text = models.TextField()
    [...]

class BlogEntry(models.Model):
    revisions = models.ManyToManyField(BlogEntryRevision)
    [...]

BlogEntryRevision対応するものが削除されたときに、関連するすべての s を削除するように Django に指示するにはどうすればよいBlogEntryですか? デフォルトでは、「反対側」のオブジェクトが削除された場合、オブジェクトを多対多の関係に保つようです。これを行う方法はありますか - できればオーバーライドせずにBlogEntry.delete?

4

4 に答える 4

23

ManyToMany 関係の性質を誤解していると思います。「該当するBlogEntry」が削除されるとのことです。しかし、ManyToMany の要点は、各 BlogEntryRevision に関連する複数のBlogEntries があることです。(もちろん、各 BlogEntry には複数の BlogEntryRevision がありますが、それは既にご存じのとおりです。)

あなたが使用した名前と、このカスケード削除機能が必要であるという事実から、BlogEntryRevision から BlogEntry への標準の ForeignKey を使用する方がよいと思います。その ForeignKey を設定しない限りnull=True、削除はカスケードされます。BlogEntry が削除されると、すべてのリビジョンも削除されます。

Django 2.0 以降

初期化子では、 パラメーターForeignKeyを指定する必要があります。on_delete

from django.db import models
from .models import MyRelatedModel


class model(models.Model):
    related_model = models.ForeignKey(MyRelatedModel, on_delete=models.CASCADE)
于 2010-10-14T20:49:21.040 に答える
4

Django はスルー モデルを使用して関係を指定するため、このメソッドを使用して関連オブジェクトを削除するだけclear()です。clear メソッドは関連するすべてのオブジェクトを削除します。BlogEntryRevision

be = BlogEntry.objects.get(id=1)
be.blogentryrevision_set.clear()
于 2018-03-12T14:27:27.320 に答える
2

カスタム モデル マネージャーを使用できますが、ドキュメントでは既にこのようなことを行っているようで、これが何を意味するのか正確には思い出せません。

便宜上、delete メソッドの名前は delete() です。このメソッドはオブジェクトをすぐに削除し、戻り値はありません。例:

e.delete()

オブジェクトを一括で削除することもできます。すべての QuerySet には、その QuerySet のすべてのメンバーを削除する delete() メソッドがあります。

たとえば、これは pub_date の年が 2005 であるすべての Entry オブジェクトを削除します。

Entry.objects.filter(pub_date__year=2005).delete()

これは可能な限り純粋に SQL で実行されるため、プロセス中に個々のオブジェクト インスタンスの delete() メソッドが呼び出されるとは限らないことに注意してください。モデル クラスにカスタムの delete() メソッドを提供し、それが確実に呼び出されるようにしたい場合は、そのモデルのインスタンスを「手動で」削除する必要があります (たとえば、QuerySet を反復処理して delete() を呼び出すなど)。 QuerySet の一括 delete() メソッドを使用するのではなく、各オブジェクトを個別に)。

Django がオブジェクトを削除するとき、SQL 制約の ON DELETE CASCADE の動作をエミュレートします。つまり、削除するオブジェクトを指す外部キーを持つオブジェクトはすべて一緒に削除されます。例えば:

b = Blog.objects.get(pk=1)
# This will delete the Blog and all of its Entry objects.
b.delete()
于 2010-10-14T20:24:54.437 に答える