Hur*_*ile 20 python django django-models
希望这是一个简单的问题.
我在理解Django 1.2中新的多数据库功能的文档时遇到了一些麻烦.首先,我似乎找不到你如何在你的一个模型中使用第二个数据库的例子.
当我在models.py中定义一个新类时,如何指定我打算连接的数据库?
我的settings.py包含类似于 -
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'modules',
'USER': 'xxx',
'PASSWORD': 'xxx',
},
'asterisk': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'users',
'USER': 'xxxx',
'PASSWORD': 'xxxx',
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:我正在阅读路由器上的文档,如假人.如果其他人正在努力解决这个问题,请确保在放弃之前阅读2到3次!
Jor*_*ter 25
是的,它有点复杂.
您可以通过多种方式实施它.基本上,您需要某种方式来指示哪些模型与哪个数据库相关联.
这是我使用的代码; 希望能帮助到你.
from django.db import connections
class DBRouter(object):
"""A router to control all database operations on models in
the contrib.auth application"""
def db_for_read(self, model, **hints):
m = model.__module__.split('.')
try:
d = m[-1]
if d in connections:
return d
except IndexError:
pass
return None
def db_for_write(self, model, **hints):
m = model.__module__.split('.')
try:
d = m[-1]
if d in connections:
return d
except IndexError:
pass
return None
def allow_syncdb(self, db, model):
"Make sure syncdb doesn't run on anything but default"
if model._meta.app_label == 'myapp':
return False
elif db == 'default':
return True
return None
Run Code Online (Sandbox Code Playgroud)
这种方式的工作方式是我创建一个文件,其中包含要使用的数据库名称以保存我的模型.在您的情况下,您将创建一个单独的models样式文件asterisk.py,该文件与应用程序的模型位于同一文件夹中.
在你的models.py文件中,你要添加
from asterisk import *
Run Code Online (Sandbox Code Playgroud)
然后,当您实际从该模型请求记录时,它的工作方式如下:
records = MyModel.object.all()MyModel是myapp.asterisk 如果你想对每个模型的数据库选择进行控制,那么这样的东西就可以了:
from django.db import connections
class DBRouter(object):
"""A router to control all database operations on models in
the contrib.auth application"""
def db_for_read(self, model, **hints):
if hasattr(model,'connection_name'):
return model.connection_name
return None
def db_for_write(self, model, **hints):
if hasattr(model,'connection_name'):
return model.connection_name
return None
def allow_syncdb(self, db, model):
if hasattr(model,'connection_name'):
return model.connection_name
return None
Run Code Online (Sandbox Code Playgroud)
然后为每个模型:
class MyModel(models.Model):
connection_name="asterisk"
#etc...
Run Code Online (Sandbox Code Playgroud)
请注意,我还没有测试过第二个选项.
Jordans的附录回答如上.对于第二个选项,allow_syncdb方法正常工作如下:
def allow_syncdb(self, db, model):
if hasattr(model,'connection_name'):
return model.connection_name == db
return db == 'default'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3299 次 |
| 最近记录: |