【问题标题】:Django multiple dbs - admin search results using a read-only dbDjango 多个数据库 - 使用只读数据库的管理员搜索结果
【发布时间】:2016-03-17 08:21:26
【问题描述】:

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

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

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

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

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

所以我对:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我想错误的答案是改为:

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

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

      我必须检查一下

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-16
        • 1970-01-01
        • 2018-01-15
        • 1970-01-01
        • 1970-01-01
        • 2010-11-02
        相关资源
        最近更新 更多