0

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 では機能しません。この信号をすべてのモデルに登録し、単に送信者のモデルを確認すると、パフォーマンスが大幅に低下しますか?

4

1 に答える 1

0

私が提案できる2つの解決策。

  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')
    
于 2012-12-02T13:39:50.790 に答える