2

モデルがそうでない場合、マルチテーブル継承を呼び出さずに (DRY 方式で) すべてのフィールドをコピーするために、既存のモデルから継承する方法はありabstractますか?

明確にするために、私にはモデルがあり、利用可能なフィールドに関して正確に反映するPost別のモデルが必要ですが、複数テーブルの継承や との何らかの関係を持たせたくありません。問題は、抽象モデルではないため、Django が複数テーブルの継承を開始することです。これを回避する方法はありますか?GhostPostPostPostPost

更新: ここで探しているのは、モデルの Python レベルの複製ではなく、それらのフィールドをミラーリングする実際の個別のデータベース テーブルです。

解決策: @Brandon のアドバイスに従い、抽象モデルを使用しました。

4

2 に答える 2

0

追加の BooleanField を追加is_ghostして、元のモデルとプロキシ モデルの両方でデフォルトのマネージャーをオーバーライドできます。

class PostManager(models.Manager):
    def get_querset(self):
        return super(PostManager, self).get_queryset().filter(is_ghost=False)

class Post(models.Model):
    ...
    is_ghost = models.BooleanField(blank=True, default=False)
    objects = PostManager()

class GhostPostManager(models.Manager):
    def get_queryset(self):
        return super(GhostPostManager, self).get_queryset().filter(is_ghost=True)

class GhostPost(Post):
    objects = GhostPostManager()

    Meta:
        proxy = True

これにより、すべてが 1 つのテーブルに保持されますが、マネージャーとクエリセットは 2 つの別個のモデル/テーブルのように動作します。

もう 1 つの解決策は、両方のモデルに抽象基本クラスを使用することです。Post元のモデルのクラス名を変更せず、eg から継承するAbstractPost場合、これで問題が発生することはないと思います。

于 2014-07-26T10:01:57.803 に答える