在独立脚本中使用Django ORM(再次)

时间:2010-03-15 03:12:32

标签: django django-models

我正在尝试在一些独立的屏幕抓取脚本中使用Django ORM。我知道之前已经问过这个问题,但是我无法找到解决我特定问题的好方法。

我有一个定义模型的Django项目。我想要做的是在我的抓取脚本中使用这些模型和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()

但是,当我尝试运行test.py时,我得到ImportError

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

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

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

有了这个,我就可以运行test.py就好了。然而,这似乎是一个黑客,更重要的是,它不是非常便携(我必须在运行此代码的任何地方创建这个符号链接)。

所以,我想知道是否有人对我的问题有更好的解决方案?

3 个答案:

答案 0 :(得分: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 :(得分:2)

你确定它不应该是:

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

另外,请确保__init__.py中有project/web/django_project个文件(空可以)。

P.S。我建议将os.path.join的输出提供给os.path.abspath而不是其他方式。

答案 2 :(得分:0)

我知道这个问题已有六年了,但这个替代方案可能会吸引搜索此主题的人。假设Django的manage.py位于project/,假设main()是脚本的入口点,那么让Django承担压力:

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