我正在使用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
对象。也许这个对象实际上是在其他地方重新使用,特别是在管理操作中...?我目前正在调查此事。
所以我对以下内容感兴趣:
答案 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),但它可以帮助优化查询。