Django如何在用户删除后删除用户的个人资料和帖子以及所有关联?
Posted
技术标签:
【中文标题】Django如何在用户删除后删除用户的个人资料和帖子以及所有关联?【英文标题】:Django how to delete user's profile and posts and all assocation after user deleted? 【发布时间】:2012-02-19 03:51:52 【问题描述】:我正在编写一个 django 项目。并且想知道用户删除自己的帐户后,有没有办法 django 内置自动删除与该用户相关的所有对象(例如一些通用的外键)?或者我应该使用信号“post_delete”来删除所有相关的对象?
【问题讨论】:
您确定相关对象尚未被删除吗?必须删除不可为空的 ForeignKey 以避免 IntegrityError,IIRC Django 默认会这样做。通用外键是指GenericForeignKey吗?因为这变得更复杂了。 @AdamKG 我想我在这里并不是指GenericForeignKey。我的意思是我已经得到答案的 ON DELETE CASCADE。只要Contenttype,GenericForeignKey的作用我还不清楚,我正在学习。另一个可能与此无关的问题,但我想问的是,我发现了一些用户配置文件实现,它们都使用 ForeignKey 而不是 OneToOne。他们假设这里是多对一关系还是无关紧要。 【参考方案1】:当 Django 删除一个对象时,默认情况下它会模拟 SQL 约束 ON 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()
【讨论】:
【参考方案2】:您应该在删除原始对象之前显式删除对原始对象的所有通用外键引用。例如
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()
级联删除在适用于模型中的一对一关系时非常有用,但它似乎不适用于通用外键关系。
【讨论】:
虽然我同意你的建议,但“它似乎不适用于通用外键关系”的说法需要进一步解释,因为这不是通常的情况。 @Wtower 这在 2012 年是正确的(Django 1.4?),但从文档 (docs.djangoproject.com/en/1.8/ref/contrib/contenttypes/…) 中可以看出,现在“如果您删除具有 GenericRelation 的对象,则任何具有 GenericForeignKey 的对象指向它也将被删除”,这可能是 Django 1.7 的更改。 @MarkChackerian 我明白了,感谢您的信息和回答。【参考方案3】:Django 建议不要删除用户,因为外键会损坏。正是因为这个原因,他们才包含了 is_active 方法。
见https://docs.djangoproject.com/en/1.3/topics/auth/#django.contrib.auth.models.User.is_active
【讨论】:
这是一个陈旧且可能已过时的建议,链接已损坏。以上是关于Django如何在用户删除后删除用户的个人资料和帖子以及所有关联?的主要内容,如果未能解决你的问题,请参考以下文章
用户离职后如何删除其个人视图(Personal View)?
如何在 django admin 的注册表单中删除用户名字段?