4

ジャンゴの一般的な関係を使用して継承モデルをエミュレートしようとしています。これまでのところ、これは私が思いついたものです:

class Base(models.Model):
  content_type = models.ForeignKey(ContentType)
  object_id = models.PositiveIntegerField()
  content_object = generic.GenericForeignKey()
  ... other stuff

  class Meta:
    unique_together = ("content_type", "object_id")

class SubClass1(models.Model):
  ... properties for this class

  _base = generic.GenericRelation(Base)

  @property
  def base(self):
    return self._base.all()[0]

ここでわかることから (できれば、少なくとも)、 はSubClass1と 1 対 1 の関係を持つ必要があります。そのため、そのフィールドを作成し、それをプロパティでカバーBaseするすべての作業を行ったのです。その一般的な関係を持つことで、カスケード削除が自動的に接続されます。これは私が望むものです (そして、他の方向から削除を接続する信号があります)。_basebasepost-delete

のサブクラスはいくつでも存在する可能性がありBase、気持ち悪いのは、_baseとそのカバー プロパティをコピーして貼り付けなければならないことです。また、これに対応するカスタム オブジェクト マネージャも用意しました。また、Base.

この共通機能をカプセル化して、サブクラスごとにコピーして貼り付ける必要がないようにする良い方法はありますか?

4

1 に答える 1

2

BaseSubClassを持っていて、それから継承しないのはなぜですか。あなたの例に基づいて:

class BaseSubClass(models.Model):
    _base = generic.GenericRelation(Base)

    class Meta:
        abstract = True

    @property
    def base(self):
      return self._base.all()[0]

class SubClass1(BaseSubClass):
    # fields
于 2011-10-03T15:02:25.923 に答える