gpt4 book ai didi

python - 多个 Django 数据库 - 在同一应用程序中将模型映射到数据库

转载 作者:搜寻专家 更新时间:2023-10-30 23:11:15 25 4
gpt4 key购买 nike

我已经到处寻找解决方案,但找不到任何东西。

我有一个 Django 项目、一个应用程序、两个模型和两个数据库。我希望一个模型能够专门与一个数据库对话和同步。这是我试过的:

设置

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
'NAME': 'database_a', # Or path to database file if using sqlite3.
# The following settings are not used with sqlite3:
'USER': 'user',
'PASSWORD': 'xxxxxx',
'HOST': 'localhost', # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
'PORT': '', # Set to empty string for default.
},
'applicationb_db': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'database_b',
'USER': 'user',
'PASSWORD': 'xxxxxx',
'HOST': 'localhost',
'PORT': '',
},
}
DATABASE_ROUTERS = ['fanmode4.router.ApiRouter']

模型

from django.db import models

class TestModelA(models.Model):
testid = models.CharField(max_length=200)
class Meta:
db_table = 'test_model_a'

class TestModelB(models.Model):
testid = models.CharField(max_length=200)
class Meta:
db_table = 'test_model_b'
app_label = 'application_b'

路由器

class ApiRouter(object):
def db_for_read(self, model, **hints):
if model._meta.app_label == 'application_b':
return 'applicationb_db'
return None

def db_for_write(self, model, **hints):
if model._meta.app_label == 'application_b':
return 'applicationb_db'
return None

def allow_relation(self, obj1, obj2, **hints):
if obj1._meta.app_label == 'application_b' or \
obj2._meta.app_label == 'application_b':
return True
return None

def allow_syncdb(self, db, model):
if db == 'applicationb_db':
return model._meta.app_label == 'application_b'
elif model._meta.app_label == 'application_b':
return False
return None

应用程序名称是“api”。基本上使用此设置,如果我同步数据库,它只会在默认数据库上同步。如果我同步指定第二个数据库的数据库 python manage.py syncdb --database=applicationb_db,它不会将任何内容同步到第二个数据库。

我只是想实现以下目标:

  • TestModelA 的所有内容都转到默认数据库
  • TestModelB 的所有内容都进入 applicationb_db 数据库
  • 其他一切都进入默认数据库

最佳答案

除了使用 model._meta.app_label,您还可以使用 model 来检查它是哪个模型并返回适当的数据库。

您可以将路由器更新为:

class ApiRouter(object):
def db_for_read(self, model, **hints):
if model == TestModelB:
return 'applicationb_db'
return None

def db_for_write(self, model, **hints):
if model == TestModelB:
return 'applicationb_db'
return None

def allow_relation(self, obj1, obj2, **hints):
if model == TestModelB:
return True
return None

def allow_syncdb(self, db, model):
if model == TestModelB:
return True
else:
return False
return None

关于python - 多个 Django 数据库 - 在同一应用程序中将模型映射到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19910290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com