【问题标题】:How to use Django models from one app for connection to db replica from second app?如何使用一个应用程序中的 Django 模型连接到第二个应用程序的数据库副本?
【发布时间】:2019-02-27 20:57:10
【问题描述】:

我的系统由两个应用程序组成,它们是独立的 Django 项目(比如说 AB),具有自己的默认数据库和自己的用户。应用程序 B 还从应用程序 A 数据库 replica 读取。

为了实现这种行为,我将应用程序 A 包含到 BINSTALLED_APPS 中,并且可以通过其模型访问 db replica。但是与用户相关的所有内容(权限、组)都一团糟。

在两个应用程序中使用django.contrib.auth 是否会导致这种行为,是否有更好的解决方案可以通过 Django ORM 处理副本?

【问题讨论】:

    标签: django django-models django-rest-framework django-authentication django-apps


    【解决方案1】:

    确实有更好的方法。在 django 世界中,它称为 DatabaseRouter。

    你可以在这里阅读:https://docs.djangoproject.com/en/2.1/topics/db/multi-db/

    这是一个非常全面的指南,如何为您的 django 应用程序实现多数据库环境。

    您始终可以编写自定义 DatabaseRouter 类,该类允许您定义以下行为:只读、只写、每个应用标签的完全访问权限,甚至是您的模型名称。

    您甚至可以手动执行此操作(但我不建议您这样做 - 因为这可能需要对当前代码库进行大量更改:

    >>> # So will this.
    >>> Author.objects.using('default').all()
    
    >>> # This will run on the 'other' database.
    >>> Author.objects.using('other').all()
    

    希望对您有所帮助 - 如果您有更多问题 - 请提出。

    【讨论】:

    • 我已经实现了自定义数据库路由器,它工作正常。问题是当Django为当前应用程序的用户模型解析组时,它在请求中使用了错误的关系:relation "matrix_user_groups" does not exist LINE 1: ... "auth_group"."name" FROM "auth_group" INNER JOIN "matrix_us...,而它应该是omega_user_group
    • 那么您应该使用应用程序 A 或 B 中的用户相关模型 - 并且不要混合使用它们。第三种选择是将用户管理提取到单独的应用程序 - 但这需要更改模型中的引用。它是一个单一的 django 应用程序吗?还是两个独立的“大”django 应用程序,里面有多个 django 应用程序?如果您想使用单用户管理,您可能需要稍微(或很多)重写应用程序 A 或 B,具体取决于应用程序的大小。
    • 最后,我们决定在项目设置中设置应用程序 A 中的用户模型应该继承的确切类,因此应用程序 B 中的 django.db.models.Model 很简单。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 2021-11-16
    • 2010-11-18
    相关资源
    最近更新 更多