【问题标题】:How to represent abstract model dependency in Django?如何在 Django 中表示抽象模型依赖?
【发布时间】:2012-11-20 02:16:57
【问题描述】:

假设我在 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。如果我为所有模型注册此信号并简单地检查我的发送者是什么模型,我会受到很大的性能损失吗?

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    我可以提出两个解决方案。

    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')
      

    【讨论】:

    • 感谢您的回答。您的第一个建议有效:)。第二个没有。你不能有一个不存在的表的外键。
    • 抱歉,我们很快就会联系上。第一个想法也不好。管理员不会调用 delete 方法进行批量删除
    • 我同意在这种情况下第二种方法不是可行的方法。
    • 好吧,我更愿意考虑在管理员中批量删除,因为它根本不是模型定义问题:) 您可以按照文档中的建议在 ModelAdmin 子类中重新定义 delete_selected 方法 - 在“警告”框:docs.djangoproject.com/en/1.4/ref/contrib/admin/actions/…)
    • 这是一个 sn-p,用于替换我最近在我的项目中使用的管理员中的删除操作:gist.github.com/4190318
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 2019-10-25
    • 2018-12-24
    • 1970-01-01
    • 2012-03-23
    • 2018-01-31
    相关资源
    最近更新 更多