2

私は次のモデルを持っています:

One
   name (Char)

Many
    one (ForeignKey,blank=True,null=True)
    title (Char)

Oneインスタンスを削除したいのですが、関連するすべてのオブジェクトはOneインスタンスとの関係を失う必要があります。現時点では、私のコードは次のようになっています。

one=One.objects.get(<some criterion>)

more=Many.objects.filter(one=one)
for m in more
    m.one=None
    m.save()
#and finally:
one.delete()

コードは何をしますか?削除する必要のあるオブジェクトを見つけ、関連するオブジェクトを検索し、ForeignKeyをNoneに設定して、最後にOneインスタンスを削除します。しかし、そのプロセスのどこかで、プロセス内のすべての関連オブジェクト(多くのインスタンス)を強制終了することもできます。私の質問は、これらの関連オブジェクトが削除されるのはなぜですか、これを防ぐにはどうすればよいですか?

4

2 に答える 2

2

与えられたコードは正しいです。質問をするときの私の問題は、私の実装のタイプミスでした。

恥ずかしい

まあ...まだ改善できることが少しあります:

more=Many.objects.filter(one=one)
for m in more
    m.one=None
    m.save()
#and finally:
one.delete()

次のように書くことができます:

for m in one.many_set.all()
    m.one=None
    m.save()
one.delete()

これは次と同等です:

one.many_set.clear()
one.delete()
于 2010-08-01T09:37:44.320 に答える
1

update()そもそも使用できます:

Many.objects.filter(one=one).update(one=None)

Djangoは関連するオブジェクトをプログラムレベルで削除すると思います(DBMSの削除カスケードはありません)。したがって、おそらくオブジェクトはある種のキャッシュにあり、Djangoはそれらがoneオブジェクトに関連しているとまだ考えています。

削除する前に、関連するオブジェクトをリストしてみてください。

print one.many_set
one.delete()

このセットにまだオブジェクトがある場合は、おそらくoneDBから再度フェッチしてから、削除する必要があります。または、次を使用できますdelete()

One.objects.filter(<criteria>).delete()
于 2010-08-01T08:20:37.563 に答える