【问题标题】:Django Multiple DB with Contenttype table带有 Contenttype 表的 Django 多数据库
【发布时间】: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 表。

处理此类事情的最佳方法是什么?我试图说服自己这没关系,但我怕以后不一致会咬我,所以我很想解决这个问题。

提前致谢。

【问题讨论】:

    标签: django


    【解决方案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 一致的跨数据库。我会深入挖掘,看看是否有解决方案。谢谢。
    猜你喜欢
    • 2018-04-14
    • 2017-05-15
    • 2015-10-24
    • 2013-08-15
    • 2021-11-15
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    相关资源
    最近更新 更多