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

Django multiple dbs - admin search results using a read-only db

我正在使用管理员 search_fields 功能。

问题:我的一些表非常大。所以搜索一直在进行,并且给我的生产数据库增加了额外的负载。

因为我有一个生产数据库的追随者,所以我认为将追随者用作只读数据库是个好主意,尤其是对于那些类型的请求。

所以我决定在 settings.DATABASES 中添加一个 'read-only' 数据库,并在我的管理员中添加 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

注意:只读数据库与默认数据库相同,我测试时出现上述错误,我还没有使用follower。我刚刚在 settings.DATABASES 中设置了一个 'read-only' 键,指向与 DATABASES['default'].

相同的字典

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

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

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

所以我感兴趣:

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

我想错误的答案是:

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

确实,搜索结果不使用 GET,而管理操作使用 POST。

我必须检查这个