2010-03-15 49 views
6

我想在某些独立的屏幕抓取脚本中使用Django ORM。我知道这个问题以前曾被问过,但我无法找到解决我的特殊问题的好方法。在独立脚本中使用Django ORM(再次)

我有一个定义模型的Django项目。我想要做的就是在我的scraping脚本中使用这些模型和ORM。我的目录结构是这样的:

project 
    scrape 
     #scraping scripts 
     ... 
     test.py 
    web 
     django_project 
      settings.py 
      ... 
      #Django files 

我试图做的project/scrape/test.py如下:

print os.path.join(os.path.abspath('..'), 'web', 'django_project') 
sys.path.append(os.path.join(os.path.abspath('..'), 'web', 'django_project')) 
print sys.path 
print "-------" 
os.environ['DJANGO_SETTINGS_MODULE'] = 'django_project.settings' 
#print os.environ 
from django_project.myapp.models import MyModel 
print MyModel.objects.count() 

不过,我得到一个ImportError,当我尝试运行test.py:

Traceback (most recent call last): 
    File "test.py", line 12, in <module> 
    from django_project.myapp.models import MyModel 
ImportError: No module named django_project.myapp.models 

我发现这个问题的一个解决方案是创建一个符号链接到../web/govcheck在scrape文件夹中:

:scrape rmanocha$ ln -s ../web/govcheck ./govcheck 

用这个,我可以运行test.py就好了。然而,这看起来像一个黑客,更重要的是,不是很便携(我将不得不在我运行此代码的任何地方创建这个符号链接)。

所以,我想知道如果有人有任何更好的解决方案,我的问题?

回答

2

你确定它不应该是:

sys.path.append(os.path.join(os.path.abspath('..'), 'web')) 

此外,还要确保在project/web/django_project有一个__init__.py文件(空是罚款)。

P.S.我建议喂os.path.join的输出到os.path.abspath而不是其他方式。

+0

谢谢 - 工程。 – 2010-03-15 04:03:50

7

找到一种简单的方法来重新使用现有的Django应用程序的控制台脚本设置:

from django.core.management import setup_environ 

import settings 
setup_environ(settings) 

from myapp.models import Object 

for o in Object.objects.all(): 
    print o 
+1

请注意,自从Django 1.4开始,setup_environ函数已被弃用。请参阅发行说明:https://docs.djangoproject.com/zh-CN/dev/releases/1.4/#django-core-management-setup-environ – 2013-10-30 15:49:48

+0

此外,请勿“导入设置”。做'从django.conf导入设置'。这将正确定位设置文件,即使它不在Python路径中。 – 2014-03-19 02:57:55

0

我知道这个问题是六岁,但这种替代可能会吸引别人搜索这个话题。假设Django的manage.pyproject/,并假设main()是脚本的入口点,然后让Django的采取应变:

./manage.py shell -c 'from scrape.test import main; main()'