Python Django中的多数据库

Python Django中的多数据库,python,django,Python,Django,我正试图在Django项目中设置许多数据库。 这是my settings.py: DATABASES = { 'default': { 'ENGINE': 'django.contrib.gis.db.backends.postgis', 'NAME': 'portail', 'USER': 'postgres', 'PASSWORD': '', 'HOST': '', 'PORT':

我正试图在Django项目中设置许多数据库。 这是my settings.py:

    DATABASES = {
    'default': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis',
        'NAME': 'portail',
        'USER': 'postgres',
        'PASSWORD': '',
        'HOST': '',
        'PORT': '',
    },
    'osm': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis',
        'NAME': 'osm', 
        'USER': 'postgres',
        'PASSWORD': '',
        'HOST': '',
        'PORT': '',
    }
}

DATABASE_ROUTERS = ['portail.router.dbrouter']
我知道,我正在使用postgres用户。我是戴夫

我在portail文件夹中有一个router.py:

class dbrouter(object): 
    def db_for_read(self, model, **hints):
        if model._meta.app_label == 'api':
            return 'osm'
        return 'default'
如果我试图获得:

http://127.0.0.1:8000/api/way/96300215
我有一个错误,我的表不存在。我想它无法确定哪个数据库

我知道我的路由器被执行了。很奇怪,如果我在django(默认和osm)中用相同的名称切换我的两个数据库“portail”和“osm”,它仍然不起作用。我知道Django正在进入“如果”

在发表一些评论之后,我向大家提出我的看法:

def getObject(request,type,id,format):

    if type == "node":
        osmObject = get_object_or_404(PlanetOsmPoint,osm_id=id)    

    if type == "way" or type == "relation":
        if type == "relation":
            id = int(id) * -1

        #Un way|relation peut-être dans la table line ou polygon, il faut tester avec un union et récuperer le type de géometrie
        cursor = connection.cursor()
        cursor.execute('SELECT ST_GeometryType(way) FROM planet_osm_line WHERE osm_id= %s UNION SELECT ST_GeometryType(way) FROM planet_osm_polygon WHERE osm_id= %s',[id,id])

        #Si plusieurs résultats, erreur !
        if cursor.rowcount != 1:
            print cursor.rowcount
            raise Http404

    osmType = cursor.fetchone()

        if osmType[0] == u'ST_Polygon':
            osmObject = get_object_or_404(PlanetOsmPolygon,osm_id=id)
        elif osmType[0] == u'ST_LineString':
            osmObject = get_object_or_404(PlanetOsmLine,osm_id=id)
        else:
            raise Http404


    if format == '' or format == "geojson" or format == "json":
        return HttpResponse(osmObject.way.geojson, content_type="application/json")
我的一个模型(PlanetOsmLine、PlanetOsmPoint或PlanetOsmPolygon相同):


我解决了我的问题。它与游标连接在一起。我认为,我要补充:

from django.db import connections
#cursor = connection.cursor()
cursor = connections['osm'].cursor()
现在,连接知道数据库了。我的路由器在这种情况下没用


来源:

您在该地址有什么查看功能?你能发布它的代码吗?@etienne trimaille,你已经确认它正在从db_for_read()返回所需的输出?您可以通过检查模型管理器上的db属性来实现这一点。我们可以查看您的视图(可能还有模型)代码,也可以尝试使用django扩展插件,使用
/manage.py runserver\u plus--print sql
@VasilyAlexeev我添加了我的视图和模型。Django扩展似乎非常有用,但我在安装它时遇到了一些困难(依赖性)。我正在重试。您是否验证了您的
应用程序名实际上是
api
?另外,您确定这两个数据库实际上都存在吗?
from django.db import connections
#cursor = connection.cursor()
cursor = connections['osm'].cursor()