Djangoの単一テーブル継承
-
04-07-2019 - |
質問
Djangoで単一テーブル継承を明示的にサポートしていますか?最後に聞いたところによると、この機能はまだ開発中および議論中だった。
その間に基本的な動作をキャプチャできるライブラリ/ハックはありますか?異なるオブジェクトを混在させる階層があります。従業員クラス、従業員のタイプのサブクラス、およびmanager_id(parent_id)を持つ企業構造の標準的な例は、私が解決しようとしている問題の適切な近似です。
私の場合、従業員は別の従業員によって管理されている間に他の従業員を管理できるという考えを表明したいと思います。 ManagerとWorkerに個別のクラスはありません。これにより、これをテーブル全体に広げることが難しくなります。サブクラスは、従業員の種類(プログラマー、会計士、営業など)を表し、だれが誰を監督するかには依存しません(OK、何らかの点でもはや典型的な企業ではないと思います)。
解決
現在、Djangoには2つの形式の継承があります。MTI(モデルテーブルの継承)とABC(抽象基本クラス)です。
チュートリアルフードの下で何が起こっているのか。
他のヒント
OPは、ここで定義するように、単一テーブル継承について尋ねていると思います。
リレーショナルデータベースは継承をサポートしていないため、オブジェクトからデータベースにマッピングするときは、リレーショナルテーブルで優れた継承構造を表現する方法を考慮する必要があります。リレーショナルデータベースにマッピングする場合、複数のテーブルの継承構造を処理するときにすぐにマウントできる結合を最小限に抑えるようにします。単一テーブル継承は、継承構造のすべてのクラスのすべてのフィールドを単一のテーブルにマッピングします。
つまり、エンティティクラスの階層全体の単一のデータベーステーブルです。 Djangoはそのような継承をサポートしていません。
私の試みを見る:
http://djangosnippets.org/snippets/2408/
「階層ごとのテーブル」のエミュレーションa.k.a.「単一テーブルの継承」 Djangoで。基本クラスはすべてのフィールドを保持する必要があります。サブクラスには追加のフィールドを含めることはできません。最適なのはプロキシである必要があります。
正確には「単一テーブルの継承」ではありませんが、多くの状況で十分に近いです。
これに似たことができると思います。
この問題の解決策を自分で実装する必要がありましたが、ここでそれを解決しました:
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がそれを頭の外でどのように処理するのか本当にわかりません。また、上記のコードは実際にはテストしませんでした。娯楽目的のためだけであり、うまくいけばあなたを正しい方向に導きます。
これは役に立つかもしれません: https://github.com/craigds/django-typed-モデル Single Table Inheritanceの実装のように見えますが、サブクラスに余分なフィールドを含めることができないという制限があります。
追加のフィールドを作成できないという問題に対処するフォークもあります。 https://github.com/KrzysiekJ/django-typed-models
更新:フォークが再びマージされた可能性があると思います
STIに関するdjango開発者のメーリングリストに関する最近の議論です。 https://groups.google.com/forum/#! msg / django-developers / -UOM8HNUnxg / 6k34kopzerEJ