带有 Contenttype 表的 Django 多数据库
Posted
技术标签:
【中文标题】带有 Contenttype 表的 Django 多数据库【英文标题】:Django Multiple DB with Contenttype table 【发布时间】:2015-03-04 19:50:21 【问题描述】:好吧,我正在现有的 django 项目上实现多数据库功能。在我创建并设置辅助数据库到 django 后,我做的第一件事是运行 syncdb 和 migrate,这将创建很多内置的 django 表,包括 django_content_type 表。
然后我意识到,新 django_content_type 表中的记录与主数据库中的记录不同。更具体地说,主键是不同的。
假设我在主数据库 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。我试图截断其中一个并从另一个加载夹具并失败,因为大多数其他表都引用了 django_content_type 表。
处理此类事情的最佳方法是什么?我试图说服自己这没关系,但我怕以后不一致会咬我,所以我很想解决这个问题。
提前致谢。
【问题讨论】:
【参考方案1】:这是一个常见问题,因为您使用不同的数据库。这里主要关注的是,当某些模型使用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。
我不是说没有解决方案,可能有同步两个数据库的解决方案。但是,我写这篇文章是为了不让你担心这种情况。
我真的希望它们保持一致,但多个数据库对我从来没有这样做过。
【讨论】:
似乎是一个合理的答案,尽管我真的很想获得那些 pk 一致的跨数据库。我会深入挖掘,看看是否有解决方案。谢谢。以上是关于带有 Contenttype 表的 Django 多数据库的主要内容,如果未能解决你的问题,请参考以下文章