背景:我有 5 个独立的 Django 项目,我试图将它们组合成 1 个由多个应用程序组成的 Django 项目。换句话说:projA 有 appA,projB 有 appB,projC 有 appC,等等。我想要 1 个 masterProj,它有 appA、appB 和 appC。
目前每个应用程序都连接到它自己的独立数据库(应用程序不共享数据)。每个项目都使用 Django 用户认证、Django 注册、taggit、profiles、comments 和 sorl-thumbnail。
我正在使用 Django 1.4 并根据这个 stackoverflow 答案设置数据库路由,这样,一旦组合到一个项目中,新组合的 Django 项目中的每个应用程序仍然能够连接到自己的数据库。进展顺利,但我开始遇到用户身份验证和 taggit 之类的问题:
1)如前所述,每个应用程序连接到不同的数据库,每个数据库都有一个名为“auth_user”的表。但是,我发现对 auth_user 表的所有读/写调用(无论哪个应用程序进行读/写调用)都被路由到默认数据库(在本例中为 appA 的数据库):
# settings.py:
DATABASES['default'] = DATABASES['appA']
DATABASE_ROUTERS = ['appA.db.DBRouter', 'appB.db.DBRouter', 'appC.db.DBRouter']
# appA/dbrouterA.py (appB, appC routers are identical this, replacing 'appA' with 'appB', etc.)
class DBRouter(object):
def db_for_read(self, model, **hints):
if model._meta.app_label == 'appA':
return 'appA'
if model._meta.app_label == 'auth':
return 'appA'
return None
def db_for_write(self, model, **hints):
if model._meta.app_label == 'appA':
return 'appA'
if model._meta.app_label == 'auth':
return 'appA'
return None
2) 假设我让路由正常工作,如果用户登录 appA,我不希望他们登录 appB。我看到很多人发布了相反的问题(他们希望他们的应用程序共享用户凭据),但是有没有人在同一个项目的多个独立应用程序中成功使用 Django 用户身份验证?如果是这样,你是怎么做到的?
3)我的 taggit 代码出现以下错误,但我无法弄清楚如何将“related_name”参数传递给 taggit。我正在使用 taggit 的基本实现 - 没有子类化任何东西:
# appA/models.py
tags = TaggableManager(blank=True)
# appB/models.py
tags = TaggableManager(blank=True)
错误:
appA.userprofile: Accessor for m2m field 'tagged_items' clashes with related m2m field 'TaggedItem.userprofile_set'. Add a related_name argument to the definition for 'tagged_items'.
appB.userprofile: Accessor for m2m field 'tagged_items' clashes with related m2m field 'TaggedItem.userprofile_set'. Add a related_name argument to the definition for 'tagged_items'.
4)我开始觉得结合所有这些应用程序是一个滑坡;稍后我可能会遇到 sorl-thumbnail 或尚未出现的评论的问题。有没有人成功地将应用程序合并到一个项目中?还是我试图做一些 Django 根本不支持的事情?
在此先感谢您的帮助!