我非常坚持这个! 我正在编写一个从外部数据库读取数据的Django视图。为此,我使用标准的MySQLdb库。 现在,要加载数据,我必须做一个非常漫长而复杂的查询。我可以在我的视图中对该查询进行硬编码,并且可以正常工作。 但我认为这不切实际;我希望以后能够更改查询,所以我尝试从文本文件加载语句。 我的问题是我不知道在哪里存储以及如何打开该文件。无论我在哪里,我都会收到“没有这样的文件或目录”错误。即使将其保存在与视图代码相同的目录中也会失败。
请注意,这不是上传的文件;它只是一个完成我的代码的外部文件。 有任何想法吗? 提前谢谢!
答案 0 :(得分:27)
将文件保存在django项目根目录中,并在settings.py文件中添加以下内容。
PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
然后在视图中执行此操作。
import os
from django.conf.settings import PROJECT_ROOT
file_ = open(os.path.join(PROJECT_ROOT, 'filename'))
更新
在较新的Django版本BASE_DIR
已经在settings.py文件中定义。所以你可以做到以下几点。
import os
from django.conf import settings
file_ = open(os.path.join(settings.BASE_DIR, 'filename'))
答案 1 :(得分:4)
对于这个用途,我将它放在设置模块中。在settings.py
中添加例如MY_LONG_QUERY = 'from FOO select BAR...'
。然后,在您的视图中,只需从以下设置中加载它:
from django.conf import settings
settings.MY_LONG_QUERY
但是,这并没有真正回答你的问题。假设权限和所有权限都是正确的,请在您的设置中保留对项目根的引用,如下所示:
ROOT_PATH = os.path.split(os.path.abspath(__file__))[0]
然后再次在您看来,打开您的文件:
from django.conf import settings
def read_from_database(request):
f = open(os.path.join(settings.ROOT_PATH, 'myfile.db'))
# Do something with f