如何在Django中表示抽象模型依赖?

时间:2012-12-02 12:32:56

标签: django django-models

让我们说我在Django中有类似的东西:

class PublicObject(models.Model):
    class Meta:
        abstract = True
    title = models.CharField()
    menu_link = models.ForeignKey('MenuLink')

class MenuLink(models.Model):
    title = models.CharField()
    parents = models.ManyToManyField('self')

class Page(PublicObject):
    page fields...

class BlogEntry(PublicObject)
    blog entry fields...

我想要的是当我删除页面或博客条目时,还要删除相应的菜单链接。 如何在不违反DRY原则的情况下在Django中执行此操作? 我必须提到: - 覆盖ModelAdmin的model_delete并不起作用,因为在Django的操作菜单中批量删除时不会调用此函数。 - 使用pre_delete模型信号不起作用,因为它需要模型的名称,但不适用于抽象模型名称。它仅适用于sender = Page或sender = BlogEntry,而不适用于sender = PublicObject。如果我为所有型号注册此信号并且只是检查我的发件人是什么型号,我会受到很大的性能损失吗?

1 个答案:

答案 0 :(得分:0)

我可以建议两种解决方案。

  1. 为什么不应该覆盖PublicObject.delete

  2. 您可以考虑另一种关系模型:

    class PublicObject(models.Model):
        class Meta:
            abstract = True
        title = models.CharField()
    
    class MenuLink(models.Model):
        title = models.CharField()
        parents = models.ManyToManyField('self')
        public_obj = models.ForeignKey('PublicObject')