2015-05-07 56 views
4

我有一個xml解析器,將該數據存儲到一個MySQL數據庫中,作爲django應用程序的一部分。解析器是爲了日常運行,捕捉一些測試輸出:在腳本中使用django模型

`dbsync.py`: 

    1 #!/usr/bin/env python 
    2 import os 
    3 os.environ['DJANGO_SETTINGS_MODULE'] = 'autotester.settings' 
    4 
    5 import xml_parser 
    6 from models import * 

Django項目被稱爲autotesterapp被稱爲autoreporter。 當我執行

python dbsync.py 

我越來越:

Traceback (most recent call last): 
    File "autoreporter/dbsync.py", line 6, in <module> 
    from models import * 
    File "/root/autotester/autoreporter/models.py", line 1, in <module> 
    from django.db import models 
    File "/usr/lib/python2.7/dist-packages/django/db/models/__init__.py", line 5, in <module> 
    from django.db.models.query import Q 
    File "/usr/lib/python2.7/dist-packages/django/db/models/query.py", line 17, in <module> 
    from django.db.models.deletion import Collector 
    File "/usr/lib/python2.7/dist-packages/django/db/models/deletion.py", line 4, in <module> 
    from django.db.models import signals, sql 
    File "/usr/lib/python2.7/dist-packages/django/db/models/sql/__init__.py", line 4, in <module> 
    from django.db.models.sql.subqueries import * 
    File "/usr/lib/python2.7/dist-packages/django/db/models/sql/subqueries.py", line 12, in <module> 
    from django.db.models.sql.query import Query 
    File "/usr/lib/python2.7/dist-packages/django/db/models/sql/query.py", line 22, in <module> 
    from django.db.models.sql import aggregates as base_aggregates_module 
    File "/usr/lib/python2.7/dist-packages/django/db/models/sql/aggregates.py", line 9, in <module> 
    ordinal_aggregate_field = IntegerField() 
    File "/usr/lib/python2.7/dist-packages/django/db/models/fields/__init__.py", line 116, in __init__ 
    self.db_tablespace = db_tablespace or settings.DEFAULT_INDEX_TABLESPACE 
    File "/usr/lib/python2.7/dist-packages/django/conf/__init__.py", line 54, in __getattr__ 
    self._setup(name) 
    File "/usr/lib/python2.7/dist-packages/django/conf/__init__.py", line 49, in _setup 
    self._wrapped = Settings(settings_module) 
    File "/usr/lib/python2.7/dist-packages/django/conf/__init__.py", line 132, in __init__ 
    % (self.SETTINGS_MODULE, e) 
ImportError: Could not import settings 'autotester.settings' (Is it on sys.path? Is there an import error in the settings file?): No module named autotester.settings 

我怎麼能有DJANGO_SETTINGS_MODULE集,這樣我就可以正常執行dbsync.py腳本?

+0

腳本的位置與您的項目結構有關嗎? – Claudiu

+0

一個問題可能是你在'PYTHONPATH'中沒有'autotester.settings' – cmidi

+1

爲什麼不讓腳本成爲Django管理命令?這將讓框架處理所有這些。 – Joe

回答

1

兩個問題

  1. 您需要從您的應用程序導入模型,所以前提是你的Django項目是在PYTHONPATH你可以簡單地通過導入應用模型:

from autoreporter.models import *

或者做一個相對導入,如果dbsync.py(從您的回溯中看)位於app目錄中。

from .models import * 
  • 添加Django項目到PYTHONPATH。您需要在PYTHONPATH中有Django項目才能從您的dbsync.py(只要它位於您的django應用程序目錄中)訪問該項目,對此快速簡單的修復就是在您的代碼中對dbsync.py執行以下操作。

    import sys 
    import os 
    ##get project directory 
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 
    ##get project parent directory and add to python path using sys.path.append 
    SYS_PATH = os.path.dirname(BASE_DIR) 
    if SYS_PATH not in sys.path: 
        sys.path.append(SYS_PATH) 
    os.environ['DJANGO_SETTINGS_MODULE'] = 'autotester.settings' 
    
  • 1

    我運行使用ORM沒有Django的其餘幾個劇本。我不會在腳本中設置環境。

    由於Django 1.7你需要導入你的模型,並運行django setup。

    我會像設置主Django應用程序一樣設置環境。然後在腳本開始處添加這些行。這些應該設置Django環境,以便可以像標準Django應用程序一樣訪問模型。

    import django 
    django.setup() 
    
    import xml_parser 
    from .models import * 
    
    +0

    如果該腳本不存在於應用程序目錄中,這項工作? 我看到你正在使用'.model'進行模型的相對導入? – cmidi

    +0

    您必須在manage.py的相同位置使用工作目錄運行它,以便正確導入設置文件。但腳本可以在任何地方。 –