【发布时间】: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