背景:我有5个独立的Django项目,我试图将它们合并成一个由几个应用程序组成的Django项目。换句话说:projA拥有appA,projB拥有appB和projC拥有appC等。我想要一个包含appA、appB和appC的主masterProj。
目前,每个应用程序连接到自己独立的数据库(应用程序不共享数据)。每个项目都使用Django用户认证、Django注册、taggit、profiles、comments和sorl-thumbnail。
我正在使用Django 1.4,并设置database routing according to this stackoverflow answer,以便在合并为一个项目后,新组合的Django项目中的每个应用程序仍能连接到自己的数据库。这一切进行得很顺利,但我开始遇到像用户认证和taggit这样的问题:
1)如前所述,每个应用程序连接到不同的数据库,每个数据库都有一个名为“auth_user”的表。然而,我发现所有对auth_user表的读/写调用(无论哪个应用程序进行读/写调用)都被路由到默认数据库(在这种情况下是appA的数据库)。
目前,每个应用程序连接到自己独立的数据库(应用程序不共享数据)。每个项目都使用Django用户认证、Django注册、taggit、profiles、comments和sorl-thumbnail。
我正在使用Django 1.4,并设置database routing according to this stackoverflow answer,以便在合并为一个项目后,新组合的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缩略图或尚未浮现的评论相关的问题。是否有人成功地将应用程序合并为单个项目?或者我正在尝试做一些Django根本不支持的事情?
提前感谢您的帮助!
using()
,以及一个会话处理程序来知道你登录的应用程序是哪个...我的直觉告诉我这是非常未开发的领域。祝你好运! - Yuji 'Tomita' Tomitafield.rel.related_name='+'
。您的Python实例需要一个唯一的属性来解析反向查找模型。将其设置为+将删除反向查找助手。 - Yuji 'Tomita' Tomitatags = TaggableManager(blank=True) tags.rel.related_name = "appA"
- 这解决了tags
变量冲突的问题,但不幸的是tagged_items
变量仍然存在相同的错误,我无法弄清楚如何将related_name
传递给该变量。另外:感谢反馈有关合并和创建单个身份验证界面的建议;我现在肯定倾向于这样做 :) 这是我第一次在stackoverflow上发布帖子,所以感谢下次分开提问的提示。 - jeweliaUserProfile
和TaggedItem
之间的关系在哪里定义?看起来你的 appA/appB 的UserProfile
模型通过 taggit 的方式与TaggedItem
建立了 FK/M2M 关系,你需要在那里设置相关名称。很抱歉,taggit 的工作原理对我来说还有些困惑。1.2+ 版本中所有标签模型都有独特的应用程序相关名称,因此我不确定FOO_set
是从哪里来的。如果您发布单独的问题,您可能会得到答案尝试,而在这里,我没有信心能够真正回答您的问题 :) - Yuji 'Tomita' Tomita