带有 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 多数据库的主要内容,如果未能解决你的问题,请参考以下文章

Django框架之RBAC+ContentType

Django-ContentType-signals 实现牛逼玩法

Django中contenttype的应用

Django中contenttype的应用

django之contenttype

django组件之contenttype