在Django视图中访问其他项目的模型导致“表不存在”错误

4 投票
1 回答
3670 浏览
提问于 2025-04-15 18:03

基础项目结构

baseproject
    baseapp
        models.py
            class BaseModel(models.Model)
            ...

其他项目结构:

project
    app
        views.py
        urls.py

project.app.views.py

import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'project.settings'
from django.conf import settings
from baseproject.baseapp.models import BaseModel
print BaseModel.objects.count()

当从命令行运行 "python views.py" 时,出现了 "表 'project.baseapp_baemodel' 不存在" 的错误。

import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'baseproject.settings'
from django.conf import settings
from baseproject.baseapp.models import BaseModel
print BaseModel.objects.count()

在将 project.settings 改为 baseproject.settings 后,它在命令行中可以正常工作。

import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'baseproject.settings'
from django.conf import settings
from baseproject.baseapp.models import BaseModel

def someview(request):
    count = BaseModel.objects.count()
    return render_to_response(...)

但是,当通过在浏览器中打开相应的 URL 访问视图时,仍然出现 "表 'project.baseapp_baemodel' 不存在" 的错误。

上面的代码有什么问题呢?

1 个回答

8

你现在是在和框架作斗争,如果你能重新考虑一下你的架构,可能会更好。Django这个框架是基于这样的假设:一个项目就是一组已安装的应用(INSTALLED_APPS),而项目的设置中会指定一个数据库,这些应用会和这个数据库同步。这里不太清楚你为什么不想按照这种方式来做,但无论你想实现什么目标,都可以在不试图从当前项目的INSTALLED_APPS之外的应用中导入模型的情况下完成。这样做是不会可靠的。

如果你想在两个项目中都使用某个应用,你应该把它放到你的PYTHONPATH(或者虚拟环境中),这样两个项目都能访问它,并且在两个项目的INSTALLED_APPS中都添加它。如果你还需要在这两个项目之间共享数据,你可以让两个项目指向同一个数据库(不过你需要小心其他可能不想共享数据的应用名称冲突)。或者,你也可以使用Django现在支持的多数据库功能,让一个项目只为那个应用使用另一个项目的数据库。

我猜如果你退一步,解释一下你想做的事情,可能会有比这些更好的解决方案。

撰写回答