在Django管理界面中更智能地删除具有多对多关系的对象

时间:2009-07-30 12:12:24

标签: django django-models django-admin

我想使用Django管理界面删除一些具有多对多关系的对象。标准删除还会删除所有相关对象以及确认页面上显示的已删除对象列表。但我不需要删除相关对象!

假设我们有ContentTopic和ContentItem:

class ContentTopic(models.Model):
    name = models.CharField()
    code = models.CharField()

class ContentItem(models.Model):
    topic = models.ManyToManyField(ContentTopic, db_index=True,\
    blank=True, related_name='content_item')

所以,我想使用Django admin删除ContentTopic实例,但我不需要删除所有相关的ContentItems。因此,确认页面应仅显示要删除的ContentTopic实例。

处理此问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

这种情况发生了,因为它的发展是为了这样做。 如果您想更改此行为,则单向可以覆盖django.db.models.Model的删除方法。

这个delete()方法实际上做了两件事,首先收集所有依赖对象的列表并删除它们。所以在这里,您可以覆盖它,获取依赖对象列表,迭代它并将其引用设置为None,而不是删除它们。从而彻底删除有关对象。

如果您想要贯穿此行为,可以从django.db.models.Models扩展一个类,覆盖delete(),并从这个新类中扩展所有模型。