だから私は次のクラスでdjangoで継承を使用しています:
class main_menu(node):
"""
main_menu(node)
Has no extra fields. All children of the root node must
be main_menu nodes
"""
# Required for tree hierarchy to work (db_column='path' for raw queries)
_path1 = models.CharField(db_column='path', max_length=Global.MAX_FILE_PATH_LENGTH, unique=True);
main_menu_blah = models.CharField(max_length=30, default='');
def __unicode__(self):
return self.main_menu_blah;
メインメニュー
class language(main_menu):
"""
language(main_menu)
Main menu used specifically for a main menu targetted
at a speaker of some language.
"""
# Required for tree hierarchy to work
_path2 = models.CharField(db_column='path', max_length=Global.MAX_FILE_PATH_LENGTH, unique=True);
language_blah = models.CharField(max_length=30, default='');
def __unicode__(self):
return self.language_blah;
言語
class language2(language):
_path3 = models.CharField(db_column='path', max_length=Global.MAX_FILE_PATH_LENGTH, unique=True);
language_blah2 = models.CharField(max_length=30, default='');
これで、これらすべてのモデルへのアクセスを問題なく挿入できます。.objects.get(...) を使用して取得することもできます。
しかし、親クラス テーブル (language2 の親である language など) から行を削除すると、language2 テーブルから最後の行を get() できません。私は実行します: subNode = language2.objects.get(_path3=);
私は常に次のエラーが発生します。
存在しません
language2 に一致するクエリが存在しません。
そして、データベース (sqlite) を調べたところ、最後のエントリが列 _path3 にあることがわかります。
さらに、生のクエリ (connection.cursor() を使用) を使用して、最後の行を取得できます。しかし、それは生データだけであり、モデル オブジェクトが必要です。ああ、 .extra() を使用しても機能しませんでした。
最後の行を取得できないのはなぜですか? (サーバーを再起動するまで)
ありがとう。
編集:別の「_path*」変数が必要なため、私の場合は抽象基本クラスは役に立ちませんが、それは別のトピックです。
db_column='path' に関しては、生のクエリがより合理化されるようにそのようにしており、それを削除しようとしました (列が「_path1」、「_path2」などになるように) が、問題は解決しません。最も紛らわしい部分は、生のクエリが機能し、サーバーを再起動すると修正されることです (新しい行が挿入されるまで、最後の行は表示されません)。
EDIT2: それで、何が起こっているのかを発見しました。私が忘れていた重要なことは、各テーブルがどのように結び付けられているかということでした。
基本クラスがある場合: クラス A
サブクラス: クラス B (A)
別のサブクラス: クラス C (B)
次のようにリンクされたテーブルがあります。
A -> B -> C
各テーブルに 2 つの行があるとします (それぞれがクラスのインスタンスを表します)。
行 1 A: Name="ジェラルド" -> B: Age="25" -> C: Gender="Male" 行 2 A: Name="Janet" -> B: Age="24" -> C: 性別=「女性」
テーブル B の行 2 が削除されると、テーブル C を指すリンクが切れます。そのため、基本的にクラスの胴体を切り刻みました。データの 1/3 が欠落しています。そのため、django はそれを存在しないと報告します。
そのため、エントリを手動で削除するときは注意してください。すべてを追跡する必要があるため、django でこの問題が発生することはありません。