1

プロジェクトに imagestore アプリをインストールしようとしています。デフォルトのモデルが正常に作成され、他のすべてのパーツが適切に機能しています。

ただし、ベース (抽象) モデルを拡張し、いくつかの複雑なメカニズムによって独自のモデルを作成する機能があります。これは私のモデルです:

from django.db import models 
from imagestore.models.bases.album import BaseAlbum 
class Newalbum(BaseAlbum): 
    title = models.CharField("title", max_length=128) 
    class Meta(BaseAlbum.Meta): 
        app_label = "imagestore" 
        abstract = False

またIMAGESTORE_ALBUM_MODEL = 'art.models.Newalbum'、設定に文字列があります。syncdb を実行すると、バックエンド モジュール「art.models」が「Newalbum」クラスを定義していないことがわかります。(「モジュール」オブジェクトには属性「Newalbum」がありません)。しかし、もちろんそれは定義しました。

そして奇妙さは始まったばかりです。imagestore がモデルを取得しようとしている場所にデバッグ ステートメントを配置すると、適切なモジュール (既にインポートされている) と適切なクラス名 (文字列) が出力されます。しかし!dir(mod)「from imagestore.models.bases.album import BaseAlbum」の前に表示された変数のみを出力します。上記の例では、「モデル」とデフォルトの下線付き属性のみを表示します。なんで?モジュールのインポートについてわからないことはありますか?

私はすでに、設定プロパティ、djangoのバージョン(および必要なアプリ)、app_labelなどの多くの厄介な組み合わせでインストールしようとしました。設定に IMAGESTORE_ALBUM_MODEL を追加しないとテーブルが作成されますが、このモデルには BaseClass の動作がありません。それで、私は何を間違っていますか?

4

1 に答える 1

1

解決しました!インポートプロセスを進めている間(imagestore.utils.load_classに以下を追加しました)

import pdb
pdb.set_trace()

循環インポートがあることがわかりました。順序は次のとおりです(少し簡略化されています)。

  1. load_class(IMAGESTORE_ALBUM_MODEL)
  2. imagestore.models.bases.album から BaseAlbum をインポート
  3. BaseAlbum には IMAGESTORE_IMAGE_MODEL (head) への FK があるため、load_class でインポートされます。
  4. load_class(IMAGESTORE_IMAGE_MODEL)
  5. from imagestore.models.bases.image import BaseImage
  6. BaseImage には IMAGESTORE_ALBUM_MODEL (アルバム) への FK があるため、load_class でインポートされます。
  7. これが __import__ を呼び出すと、IMAGESTORE_ALBUM_MODEL は既に sys.modules にありますが、まだビルド中であるため不完全です。したがって、モジュールにはまだ「Album」属性がありません。

簡単な解決策は、head フィールドを models.album.Album に移動し、BaseAlbum から削除することです。これを行った後、サイトを再び稼働させることができました。新しいアプリではモデル パッケージ (単純な models.py ではありません) を使用し、Image と Album を別々のファイルで使用する必要があります。

これで十分に明確でない場合は、私に連絡してください。改善を試みます。

于 2012-05-14T03:03:04.690 に答える