Django多个DB与Contenttype表

时间:2015-03-04 19:50:21

标签: django

好吧,我正在现有的django项目上实现多数据库功能。在我创建并设置辅助数据库到django之后,我做的第一件事就是运行syncdb和migrate,这将创建很多内置的django表,包括django_content_type表。

然后我意识到,新的django_content_type表中的记录与主db中的记录不同。更具体地说,主键是不同的。

假设我在主db django_content_type表中有一条记录如下:

 id | name | app_label | model 
----+------+-----------+-------
 33 | Tag  | taggit    | tag

然而,在syncdb和正在运行的迁移之后,我在我的辅助数据库中得到了跟进:

 id | name | app_label | model 
----+------+-----------+-------
 11 | Tag  | entities  | tag

我讨厌在我的两个数据库中有两个不一致的django_content_type。我试图截断其中一个并从另一个加载一个fixture并失败,因为大多数其他表都引用了django_content_type表。

处理这样的事情的最佳方法是什么?我试着说服自己这无关紧要,但我担心将来会出现不一致的情况,所以我真的想解决这个问题。

提前致谢。

1 个答案:

答案 0 :(得分:2)

由于您使用的是不同的数据库,因此这是一个常见问题。这里主要关注的是当某些模型使用ContentType作为字段时,它将被转换为数据库中的FK content_type_object_id,如果数据库中的那些不同,则可能导致错误。因此,由于您的应用程序中需要两个数据库,因此您应该使用db_manager()而不是using()来管理您的呼叫

例如:

在您的应用程序中,这可能会导致错误

ContentType.objects.get_for_model(Tag)

因为您使用的是管理器方法get_for_model(),所以您需要先指定数据库。

ContentType.objects.db_manager(...).get_for_model(Tag)

通过这种方式,您将确保根据指定数据库中已解决的PK获取ContentType。


我不是说没有解决方案,可能有一个同步两个数据库的解决方案。但是,我写这个是为了不担心你的情况。

我真的更喜欢他们会保持一致,但多个数据库永远不会对我有用。