好吧,我正在现有的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表。
处理这样的事情的最佳方法是什么?我试着说服自己这无关紧要,但我担心将来会出现不一致的情况,所以我真的想解决这个问题。
提前致谢。
答案 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。
我不是说没有解决方案,可能有一个同步两个数据库的解决方案。但是,我写这个是为了不担心你的情况。
我真的更喜欢他们会保持一致,但多个数据库永远不会对我有用。