我有各种使用to_python
方法解密的数据库字段。我遇到的问题是每次访问此特定模型的管理部分(admin.ModelAdmin
列表)时,该页面需要很长时间才能加载。我不需要to_python
方法来解密列表页面上的字段,因为我列出的字段或列根本没有加密。当用户点击某个项目进行编辑时,to_python
方法会启动,这很好,完全符合预期。但是,如何在列出对象时停止尝试解密对象的to_python
方法,请注意列表视图仅显示未加密的字段?此外,这会导致过滤器工作得非常慢。同样,过滤仅在非加密字段上完成,因此不需要to_python
方法自行执行。
答案 0 :(得分:5)
所以问题是管理员会为每一行加载整个模型实例,即使你只显示了几个字段。解决方案应该是覆盖queryset
子类中的ModelAdmin
方法,以便它不使用默认管理器的标准get_query_set
方法,而只使用only
方法得到你想要的字段:
class MyModelAdmin(admin.ModelAdmin):
list_display = ('foo', 'bar')
def queryset(self, request):
qs = self.model._default_manager.only('foo', 'bar')
ordering = self.get_ordering(request)
if ordering:
qs = qs.order_by(*ordering)
return qs
(或者您可以使用defer('my_expensive_field')
,这相当于相同的事情。)