1

だから私は次のクラスで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 でこの問題が発生することはありません。

4

1 に答える 1

0

最初に気付いたのは、他のクラスから継承し、独自のフィールドを追加している 2 つのモデルがあるが、同じ を使用していることですdb_column。これを実現するためのよりクリーンな方法 (を直接使用していない場合main_menu) は、Abstract Base Classを使用することです。

事実上、language2モデルには次のフィールドがあります。

    _path1 = models.CharField(db_column='path', max_length=Global.MAX_FILE_PATH_LENGTH, unique=True)
    _path2 = models.CharField(db_column='path', max_length=Global.MAX_FILE_PATH_LENGTH, unique=True)
    _path3 = models.CharField(db_column='path', max_length=Global.MAX_FILE_PATH_LENGTH, unique=True)
    main_menu_blah = models.CharField(max_length=30, default='')
    language_blah = models.CharField(max_length=30, default='')
    language_blah2 = models.CharField(max_length=30, default='')

また、Python では、各ステートメントの末尾にセミコロンは必要ありません。

于 2013-02-28T00:20:43.970 に答える