1

django db を更新する python スクリプトが必要です。django プロジェクト ディレクトリの最上位にある場合は正常に動作しますが、サブディレクトリにある場合は ImportError で失敗します。

私のプロジェクトはこれよりも複雑ですが、私のプロジェクト ディレクトリの例を以下に示します。

    myproj/
    ├── settings.py
    ├── manage.py
    ├── bin/
    ├── myapp/
    │   ├── __init__.py
    │   ├── models.py
    │   ├── templates/
    │   ├── urls.py
    │   ├── views.py
    └── myproj.db

パッケージ myproj は python パスにあり、settings.py 内の INSTALLED_APPS タプルには「myapp」がリストされています。

さて、このような単純な python スクリプトがあるとします。

import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproj.settings'

from django.contrib.auth.models import User

print User.objects.filter(username='foo').count()

これに test.py という名前を付けて myproj/ の先頭に配置し、myproj/ 内から python test.py を実行すると、すべて正常に動作します (たとえば、「foo」というユーザーがいる場合は 1 が出力されます)。

test.py を myproj/bin/ に移動し、myproj/bin 内から python test.py を実行すると、次のような一連のエラーが発生します。

    Traceback (most recent call last):
      File "test.py", line 6, in <module>
        print User.objects.filter(username='foo').count() 
      File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py", line 155, in filter
        return self.get_query_set().filter(*args, **kwargs)
      File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 669, in filter
        return self._filter_or_exclude(False, *args, **kwargs)
      File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 687, in _filter_or_exclude
        clone.query.add_q(Q(*args, **kwargs))
      File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/query.py", line 1271, in add_q
        can_reuse=used_aliases, force_having=force_having)
      File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/query.py", line 1139, in add_filter
        process_extras=process_extras)
      File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/query.py", line 1325, in setup_joins
        field, model, direct, m2m = opts.get_field_by_name(name)
      File "/usr/local/lib/python2.7/dist-packages/django/db/models/options.py", line 351, in get_field_by_name
        cache = self.init_name_map()
      File "/usr/local/lib/python2.7/dist-packages/django/db/models/options.py", line 380, in init_name_map
        for f, model in self.get_all_related_m2m_objects_with_model():
      File "/usr/local/lib/python2.7/dist-packages/django/db/models/options.py", line 469, in get_all_related_m2m_objects_with_model
        cache = self._fill_related_many_to_many_cache()
      File "/usr/local/lib/python2.7/dist-packages/django/db/models/options.py", line 483, in _fill_related_many_to_many_cache
        for klass in get_models(only_installed=False):
      File "/usr/local/lib/python2.7/dist-packages/django/db/models/loading.py", line 197, in get_models
        self._populate()
      File "/usr/local/lib/python2.7/dist-packages/django/db/models/loading.py", line 72, in _populate
        self.load_app(app_name, True)
      File "/usr/local/lib/python2.7/dist-packages/django/db/models/loading.py", line 94, in load_app
        app_module = import_module(app_name)
      File "/usr/local/lib/python2.7/dist-packages/django/utils/importlib.py", line 35, in import_module
        __import__(name)
    ImportError: No module named myapp

これらのエラーをどうすればよいかわかりません。彼らは、何がうまくいかなかったのかを本当に明確にしません。おそらくdjangoは独自のインポート関数を使用しており、おそらくpythonスクリプトとsettings.pyファイルの相対的な位置の影響を受けています。

洞察はありますか?

4

1 に答える 1

0

問題は次の行です。os.environ['DJANGO_SETTINGS_MODULE'] = 'myproj.settings'

  • スクリプトが outsidemyproj/の場合、PYTHON_PATH は outsidemyproj/で始まるためmyproj、有効なパッケージです。

  • スクリプトが 内myproj/にある場合、 PYTHON_PATH は 内myproj/で開始されるためmyproj、有効なパッケージではなくなります。

修正は、スクリプト内から PYTHON_PATH を明示的に設定することです。

でも

代わりに、スクリプトを管理コマンドに変換して、コードを実行するpython manage.py myscriptにDjango が必要なすべての初期化とチェックを実行できるようにする必要があります。

于 2013-10-04T02:47:31.713 に答える