Django多个dbs - 使用只读数据库管理搜索结果

时间:2015-12-11 12:08:58

标签: django django-admin django-settings django-database

我正在使用admin search_fields功能。

问题:我的一些桌子非常大。因此,搜索将永远耗尽,并在我的生产数据库中增加额外的负载。

由于我有一个我的生产数据库的追随者,我虽然一个好主意是将跟随者用作只读数据库,特别是对于那些请求。

所以我决定在我的管理类中添加一个'只读'数据库settings.DATABASES和附加ModelAdmin.get_search_results

def get_search_results(self, request, queryset, search_term):
    queryset, use_distinct = super(ReadOnlyDatabaseAdmin, self)\
        .get_search_results(request, queryset, search_term)

    queryset = queryset.using('read-only')

    return queryset, use_distinct

在此更新之后,当我尝试将某个对象设置为另一个对象的外键相关对象时,我开始遇到一些路由器错误:

Cannot assign "...": the current database router prevents this relation

注意:当我测试并得到上述错误时,只读数据库与默认数据库相同,我还没有使用关注者。我刚刚在'read-only'中设置了一个settings.DATABASES密钥,指向与DATABASES['default']相同的字典。

所以问题不在于使用不同的数据库,而是来自数据库路由器。

提供更多详细信息:此错误主要来自管理搜索结果页面(/admin/app/obj/?q=...)中执行的管理操作。

我认为这可能是因为我替换了方法中的queryset对象。也许这个对象实际上是在其他地方重新使用,特别是在管理操作中...?我目前正在调查此事。

所以我对以下内容感兴趣:

  • 找出错误原因
  • 和/或找到另一种在关注者数据库上执行管理员搜索请求以卸载主数据库的方法

2 个答案:

答案 0 :(得分:2)

我想错误的答案是:

if request.method == 'GET':
    queryset = queryset.using('read-only')

确实,搜索结果不是GET,而管理操作是通过POST完成的。

我将不得不检查这个

答案 1 :(得分:0)

这并不是您正在寻找How to improved query performance in Django admin search on related fields (MySQL),但它可以帮助优化查询。