5

私はこのモデルを持っています:

class BillHeader(models.Model):
    billno = models.IntegerField(primary_key=True, blank=True)

class BillData(models.Model):
    price = models.DecimalField(_('Price'), max_digits=12, decimal_places=2)
    amount = models.DecimalField(_('Amount'), max_digits=6, decimal_places=2)

    [... rest of the model ...]

    class Meta:
        abstract = True

class BillFooter(models.Model):
    total = models.DecimalField(_('Total'), max_digits=12, decimal_places=2)

    [... rest of the model ...]

    class Meta:
        abstract = True

BillDataそして、BillFooterすべてに共通しているBillHeaderので、私はそれらをとしてマークしましたabstract。できますclass BillHeader(BillData, BillFooter)か、それとも何か間違ったことをしていますか?

BillData私もメインのことを考えて、BillHeader BillFooter抽象化しました。私はデータモデル(少なくとも複雑なモデルではない)を実行した経験がなく、少し迷っています。あなたは何をお勧めします?

4

1 に答える 1

9

はい、Django モデルは、あいまいな「モデル解決順序」にならない限り、好きなだけ抽象基本クラスから継承できます。継承をチェーンと考えてください...継承元の各クラスはチェーン内のリンクです。2 つの基本クラスからの継承は、チェーンに 1 つではなく 2 つのリンクを追加するだけです。

つまり、抽象基本クラスが から継承する場合、抽象基本クラスmodels.Modelクラスの両方から継承しようとしないでください。はすでに継承チェーンに含まれているため、そこから継承すると、基本クラスのチェーンに混乱が生じます。 models.ModelBillmodels.Model

これらのクラスをどのよう構築するかというと、 、、およびBillから継承した というモデルを作成します。この理由は、Django モデルが個別のオブジェクト (たとえば、Bill、Article、BlogPost、Photo など) を表すのが好きだからです。BillHeaderBillDataBillFooter

ただし、抽象基本クラスのポイントは、複数のクラスがそれらから継承できるように、共通のフィールドとメソッドに抽象化のレベルを追加できることです。Bill クラスを作成するだけでは、意味がありません。ただし、Bill、UnpaidBill、および PaidBill がある場合、それらすべてに表示される共通のフィールドがあり、ABC に抽象化することで多くの問題を回避できます。

願わくば、ABC と継承が何に役立つかについて少し洞察を提供してくれることを願っています。

于 2010-06-29T20:07:32.840 に答える