我正在使用管理员
问题:我的一些表非常大。所以搜索需要很长时间,并在我的生产数据库上增加额外的负荷。
由于我有一个生产数据库的追随者,我认为一个好主意是将追随者用作只读数据库,特别是对于这种请求。
因此,我决定在
注意:当我测试并得到上述错误时,只读数据库与默认数据库相同,我还没有使用过跟随者。我只是在
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
对象。也许这个对象实际上在其他地方被重复使用,特别是在管理员操作中...? 我目前正在研究这个问题。
因此,我对以下事项感兴趣:
- 找出错误的原因
- 和/或寻找另一种在跟随者数据库上执行管理搜索请求以卸载主要数据库的方法