2012-01-25 3 views
9

私はdjangoプロジェクトを書いています。そして、ユーザーが自分のアカウントを削除した後に知りたいのであれば、このユーザーに関連するすべてのオブジェクトを自動的に削除する方法はありますか(例えば、いくつかの一般的なforeign_key)?あるいは、関連するすべてのオブジェクトを削除するために "post_delete"というシグナルを使うべきですか?Djangoユーザーのプロファイルと投稿を削除する方法と、ユーザーが削除した後にすべてのアサーションを削除する方法はありますか?

+0

を参照してください。あなたは、関連するオブジェクトがすでに削除されていませんか? IntegrityErrorを避けるためにnullを許可しないForeignKeysを削除する必要があり、デフォルトでIIRC Djangoがそうするでしょう。一般的な外部キーによって、あなたは[GenericForeignKey](https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#django.contrib.contenttypes.generic.GenericForeignKey)を具体的に意味しますか?それはより複雑になるからです。 – AdamKG

+0

@AdamKGここで特にGenericForeignKeyを意味するわけではないと思います。私が意味するのは、私がすでに答えを得ているON DELETE CASCADEです。私は、Contenttypeの間、GenericForeignKeyが何をしているのか、私が勉強していることを明確に理解していません。これとは関係のない別の質問ですが、私はいくつかのユーザープロファイルの実装を見つけました。彼らはすべてOneToOneではなくForeignKeyを使用しています。彼らはここで多対1の関係を取っていると考えていますか、それとも重要ではありません。 – Xinghan

答えて

13

Djangoはオブジェクトを削除すると、デフォルトでSQL DELETE CASCADEの動作をエミュレートします。つまり、削除対象のオブジェクトを指す外部キーを持つオブジェクトはすべて削除されます。

https://docs.djangoproject.com/en/dev/topics/db/queries/#deleting-objects

b = Blog.objects.get(pk=1) 
# This will delete the Blog and all of its Entry objects. 
b.delete() 
+0

ありがとうございます! – Xinghan

5

あなたは、元のオブジェクトを削除する前に、明示的に元のオブジェクトへの一般的な外部キー参照をすべて削除する必要があります。それはモデルで1対1の関係のために、例えば、動作しますが、一般的な外部キーの関係のために動作するようには思えないとき例えば

Image.objects.filter(object_id=object_to_be_deleted.id,content_type = ContentType.objects.get_for_model(bject_to_be_deleted.get_profile())).delete() 
object_to_be_deleted.delete() 

カスケード削除は素晴らしいです。

+0

ありがとうございました! – Xinghan

+0

私はあなたの推薦に同意しますが、「一般的な外部キー関係では機能しないようです」という文章は、これが通常の場合ではないため、さらに説明が必要です。 – Wtower

+0

@Wtowerこれは2012年にも当てはまりましたが(Django 1.4?)、ドキュメンテーション(https://docs.djangoproject.com/en/1.8/ref/contrib/contenttypes/#reverse-generic-relations) GenericRelationを持つオブジェクトを削除すると、それを指すGenericForeignKeyを持つオブジェクトも削除されます。これはDjango 1.7の変更であった可能性があります。 –

関連する問題