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

Ris*_*cha 7 django django-models

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

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

project
    scrape
        #scraping scripts
        ...
        test.py
    web
        django_project
            settings.py
            ...
            #Django files
Run Code Online (Sandbox Code Playgroud)

我尝试过以下方面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()
Run Code Online (Sandbox Code Playgroud)

但是,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
Run Code Online (Sandbox Code Playgroud)

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

:scrape rmanocha$ ln -s ../web/govcheck ./govcheck
Run Code Online (Sandbox Code Playgroud)

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

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

ily*_* b. 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
Run Code Online (Sandbox Code Playgroud)


Mik*_*one 2

你确定它不应该是:

sys.path.append(os.path.join(os.path.abspath('..'), 'web'))
Run Code Online (Sandbox Code Playgroud)

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

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