34

Django での単一テーブル継承の明示的なサポートはありますか? 最後に聞いたのは、この機能はまだ開発中であり、議論の最中だったということです。

それまでの間、基本的な動作をキャプチャするために使用できるライブラリ/ハックはありますか? さまざまなオブジェクトが混在する階層があります。従業員クラス、従業員の種類のサブクラス、および manager_id (parent_id) を持つ企業構造の標準的な例は、私が解決しようとしている問題の適切な近似です。

私の場合、従業員が別の従業員によって管理されている間、他の従業員を管理できるという考えを表現したいと思います。Manager と Worker に個別のクラスがないため、これをテーブル全体に広げるのが難しくなります。サブクラスは、従業員のタイプ (プログラマー、会計士、販売員など) を表し、誰が誰を監督するかは関係ありません (OK、いくつかの点で典型的な企業ではなくなったと思います)。

4

6 に答える 6

21

ここで定義されているように、OPは単一テーブルの継承について尋ねていると思います:

リレーショナル データベースは継承をサポートしていないため、オブジェクトからデータベースにマッピングする場合、リレーショナル テーブルで適切な継承構造を表現する方法を検討する必要があります。リレーショナル データベースにマッピングするとき、複数のテーブルで継承構造を処理するときにすぐにマウントできる結合を最小限に抑えようとします。単一テーブルの継承は、継承構造のすべてのクラスのすべてのフィールドを単一のテーブルにマップします。

つまり、エンティティ クラスの階層全体に対する単一のデータベース テーブルです。Django はその種の継承をサポートしていません。

于 2009-11-12T08:25:21.663 に答える
19

現在、Django には、MTI (モデル テーブルの継承) と ABC (抽象基底クラス) の 2 つの形式の継承があります。

ボンネットの下で何が起こっているかについてのチュートリアルを書きました。

モデルの継承に関する公式ドキュメントも参照できます。

于 2008-10-28T14:29:20.990 に答える
4

私の試みを見てください:

http://djangosnippets.org/snippets/2408/

Django の「階層ごとのテーブル」別名「単一テーブル継承」のエミュレーション。基本クラスはすべてのフィールドを保持する必要があります。そのサブクラスには追加のフィールドを含めることは許可されておらず、最適にはプロキシにする必要があります。

正確には「単一テーブルの継承」ではありませんが、多くの状況に十分に近いものです。

于 2011-04-11T01:00:01.807 に答える
2

これは役に立つかもしれません:https ://github.com/craigds/django-typed-models これは単一テーブル継承の実装のように見えますが、サブクラスが追加のフィールドを持つことができないという制限があります。

STIに関するdjango開発者メーリングリストに関する最近の議論は次のとおりです: https ://groups.google.com/forum/#!msg / django-developers / -UOM8HNUnxg / 6k34kopzerEJ

于 2013-02-02T12:31:11.727 に答える
2

これに似たことができると思います。

この問題の解決策を自分で実装する必要があります。これが解決方法です。

class Citrus(models.Model):
    how_acidic = models.PositiveIntegerField(max_value=100)
    skin_color = models.CharField()
    type = models.CharField()

class TangeloManager(models.Manager):
    def get_query_set(self):
        return super(TangeloManager, self).get_query_set().filter(type='Tangelo')
    
class Tangelo(models.Model):
   how_acidic = models.PositiveIntegerField(max_value=100)
   skin_color = models.CharField()
   type = models.CharField()
   objects = TangeloManager()

   class Meta:
       # 'appname' below is going to vary with the name of your app
       db_table = u'appname_citrus'

これにはいくつかのロックの問題がある可能性があります... djangoが頭の上でそれをどのように処理するかはよくわかりません。また、上記のコードを実際にテストしたわけではありません。これは厳密に娯楽目的のためであり、うまくいけば正しい軌道に乗せることができます。

于 2010-03-05T00:28:58.310 に答える