0

私はいくつかの抽象モデルを持っています:

class MyModel(models.Model):
    #some filelds...
    class Meta:
        abstract = True

このモデルを次のようにインポートする場合from project.application.models import MyModel: このクラスをインポートします:<class 'project.application.models.MyModel'>しかし、次のようにインポートする場合:このクラスを接頭辞from application.models import MyModelなしでインポートします:project<class 'application.models.MyModel'>

モデルが抽象的でない場合、常にproject接頭辞付きでインポートされます:<class 'project.application.models.MyModel'>

そのため、 issubclass 関数を使用しようとすると、奇妙な動作が発生します。

問題は、django 抽象モデルがこのようにインポートされた理由と、この動作を回避する方法です。

4

1 に答える 1

0

説明

これがDjangoまたは抽象クラスと関係があるかどうかはわかりませんが、パスの構築方法と関係があります。

次の例を見てください。

dir0/
    dir1/
        __init__.py 
        dir2/
            __init__.py containing class A

ここで、両方があなたの道を進んでいると仮定するdir0と、次のようになります。dir1

>>> from dir2 import B
>>> B
<class 'dir2.B'>
>>> from dir1.dir2 import B
>>> B
<class 'dir1.dir2.B'>

ソリューション

幸いなことに、django 1.4以降、パストリックは不要になり、この状況は発生しなくなりました。あなたのmanage.pyを含むディレクトリとあなたのプロジェクトフォルダ、アプリフォルダだけがあなたのパスにあるべきです。

インポートでプロジェクトを使用しないでください。使用import myapp...するfrom myapp...と、アプリが再利用できなくなります。

古いプロジェクトのレイアウトと新しいプロジェクトのレイアウトを比較する1.4のdjangoドキュメントを確認できます。

于 2012-08-17T14:01:38.010 に答える