Доступ к моделям в другом проекте в представлении Django, приводящем к ошибке «таблица не существует» - PullRequest
2 голосов
/ 15 января 2010

Базовая структура проекта

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()

возникла ошибка «Таблица» 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()

После изменения 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(...)

Но все равно возникла ошибка «Таблица» project.baseapp_baemodel «не существует» при доступе к представлению путем открытия соответствующего URL в браузере.

Что не так в коде выше?

1 Ответ

6 голосов
/ 15 января 2010

Вы боретесь против фреймворка здесь, и вам будет лучше, если вы переосмыслите свою архитектуру. Django построен на предположении, что проект = данный набор INSTALLED_APPS, а настройки проекта называют базу данных, с которой синхронизируются эти приложения. Здесь не ясно, какая у вас проблема с этим, но чего бы вы ни пытались достичь, этого можно достичь, не пытаясь импортировать модели из приложения, которого нет в INSTALLED_APPS вашего текущего проекта. Это никогда не сработает надежно.

Если есть приложение, которое вы хотите в обоих проектах, вы должны поместить его в свой PYTHONPATH (или в virtualenvs), чтобы оба проекта могли получить к нему доступ, и поместить его в INSTALLED_APPS обоих проектов. Если вам также нужно, чтобы их данные распределялись между проектами, вы могли бы указать оба проекта на одну и ту же базу данных (хотя вам следует быть осторожным с другими конфликтующими именами приложений, которые могут не требовать совместного использования данных). Или вы можете использовать поддержку нескольких баз данных, которая сейчас находится в стволе Django, чтобы один проект использовал базу данных другого проекта только для этого одного приложения.

Полагаю, если вы сделаете шаг назад и объясните, что вы пытаетесь сделать, есть даже лучшие решения, чем те.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...