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
对象。也许这个对象实际上在其他地方被重新使用,特别是在管理操作中......?我目前正在研究这个。
所以我感兴趣:
- 查找错误原因
- and/or 找到另一种在关注者数据库上执行管理搜索请求以卸载主数据库的方法
这不是您要找的 How to improved query performance in Django admin search on related fields (MySQL),但它可以帮助优化查询。
我想错误的答案是:
if request.method == 'GET':
queryset = queryset.using('read-only')
确实,搜索结果不使用 GET,而管理操作使用 POST。
我必须检查这个
我正在使用管理员 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
对象。也许这个对象实际上在其他地方被重新使用,特别是在管理操作中......?我目前正在研究这个。
所以我感兴趣:
- 查找错误原因
- and/or 找到另一种在关注者数据库上执行管理搜索请求以卸载主数据库的方法
这不是您要找的 How to improved query performance in Django admin search on related fields (MySQL),但它可以帮助优化查询。
我想错误的答案是:
if request.method == 'GET':
queryset = queryset.using('read-only')
确实,搜索结果不使用 GET,而管理操作使用 POST。
我必须检查这个