我正在尝试使用postgresql和postgis运行DJango
对于Django& postgresql我按如下方式配置setting.py
文件
DATABASES = {
'default': {
'ENGINE':'django.db.backends.postgresql_psycopg2',
'NAME': 'myDatabaseName',
'USER': 'postgres',
'PASSWORD': 'MyPassword',
'HOST': '',
'PORT': '5432',
}
}
但是看看Django geo示例教程显示使用这个
DATABASES = {
'default': {
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'NAME': 'geodjango',
'USER': 'geo',
}
}
问题:我需要两个引擎在同一个数据库上工作,因为我正在使用带postgis扩展名的postgresql,我想定义一个包含如下地理列的表:< / p>
MapLocation GEOGRAPHY(POINT)
并从Django中引用它,如maplocation = models.PointField()
显然我需要两个引擎的混搭,其余的如上面提到的'默认'我只是不知道如何让它工作
答案 0 :(得分:2)
在Django中,您可以定义多个数据库连接:
DATABASES = {
'default': {
'NAME': 'app_data',
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'USER': 'postgres_user',
'PASSWORD': 's3krit'
},
'users': {
'NAME': 'user_data',
'ENGINE': 'django.db.backends.mysql',
'USER': 'mysql_user',
'PASSWORD': 'priv4te'
}
}
参考:https://docs.djangoproject.com/en/dev/topics/db/multi-db/#defining-your-databases
答案 1 :(得分:1)
我可能有点晚了,但如果其他人偶然发现此链接,我是这样做的:
在您的 settings.py 中
DATABASES = {
'default': {
'NAME': 'app_data',
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'USER': 'postgres_user',
'PASSWORD': 's3krit'
},
'location': {
'NAME': 'app_data',
'ENGINE': 'django.contrib.gis.db.backends.postgis',,
'USER': 'postgres_user',
'PASSWORD': 's3krit'
}
}
所以我们只在设置中更改了引擎。
现在,我们需要告诉数据库从第二个数据库写入和读取地理数据。
为此,在您的models.py 中,假设您有一个Location 类:
class Location(models.Model):
location_points = models.PointField(default=Point(0,0))
address = models.TextField(null=True,blank=True)
label = models.CharField(max_length=200,null=True,blank=True)
class Meta:
db_table = 'location'
注意Meta类中的db_table属性,这是必须的。
现在您需要定义数据库路由器以在 db_table 为 'location' 时使用 'location' 数据库。
路由器类应如下所示:
class DbRouter(object):
"""
A router to control all database operations on models in the
auth application.
"""
def db_for_read(self, model, **hints):
"""
Attempts to read location models go to location database.
"""
if model._meta.db_table == 'location':
return 'location'
return 'default'
def db_for_write(self, model, **hints):
"""
Attempts to write location models go to the location database.
"""
if model._meta.db_table == 'location':
return 'location'
return 'default'
def allow_relation(self, obj1, obj2, **hints):
"""
allow relations involving the location database
"""
return True
您现在可以开始了,将路由器类保存在您的应用程序中名为 dbrouter.py 的文件中。
并在您的 settings.py 文件中添加:
DATABASE_ROUTERS = ['app_name.dbrouters.DbRouter', ]