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

jac*_*ack 2 python django model

基础项目结构

baseproject
    baseapp
        models.py
            class BaseModel(models.Model)
            ...
Run Code Online (Sandbox Code Playgroud)

其他项目结构:

project
    app
        views.py
        urls.py
Run Code Online (Sandbox Code Playgroud)

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

从命令行运行时,它引发了"表'project.baseapp_baemodel'不存在"错误:"python views.py".

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

将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(...)
Run Code Online (Sandbox Code Playgroud)

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

上面的代码有什么问题?

Car*_*yer 6

你在这里反对这个框架,如果你重新考虑你的架构,你会更好.Django是基于一个项目=一组给定的INSTALLED_APPS,项目设置命名这些应用程序同步到的数据库的假设而构建的.目前还不清楚你只是按照这样的方式做了什么问题,但无论你想要实现什么,都可以实现,而不是试图从当前项目的INSTALLED_APPS中的应用程序导入模型.这永远不会可靠地运作.

如果在两个项目中都有一个你想要的应用程序,你应该把它放在PYTHONPATH(或virtualenvs)中,这样两个项目都可以访问它,并将它放在两个项目的INSTALLED_APPS中.如果您还需要在项目之间共享其数据,则可以将两个项目指向同一个数据库(尽管您需要注意其他可能不想共享数据的冲突应用程序名称).或者您可以使用现在在Django主干中的多数据库支持,让一个项目仅为该应用程序使用另一个项目的数据库.

我的猜测是,如果你支持一个步骤并解释你想要做什么,那么有更好的解决方案.