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

3
我正在使用管理员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

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

因此问题不是来自使用不同的数据库,而是严格来自数据库路由器。

更详细地说,这个错误显然来自于在管理员搜索结果页面(/admin/app/obj/?q=...)执行的管理操作。

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

因此,我对以下事项感兴趣:

  • 找出错误的原因
  • 和/或寻找另一种在跟随者数据库上执行管理搜索请求以卸载主要数据库的方法
2个回答

3
我猜这个错误的解决方法是改成以下方式:
if request.method == 'GET':
    queryset = queryset.using('read-only')

实际上,搜索结果使用GET方法,而管理员操作使用POST方法。

我需要检查一下。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接