每次从DB加载数据时都会调用to_python

Imr*_*zad 0 python django django-admin

我有各种使用该to_python方法解密的数据库字段.我遇到的问题是,每次访问admin.ModelAdmin此特定模型的管理部分(列表)时,页面都需要很长时间才能加载.我不需要该to_python方法来解密列表页面上的字段,因为我列出的字段或列根本没有加密.当用户点击某个项目进行编辑时,该to_python方法会完全按照预期启动,这很好.但是,如何to_python在列出对象时停止尝试解密对象的方法,请记住列表视图仅显示未加密的字段?此外,这会导致过滤器工作得非常慢.同样,过滤仅在非加密字段上完成,因此不需要该to_python方法自行执行.

Dan*_*man 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
Run Code Online (Sandbox Code Playgroud)

(或者你可以使用defer('my_expensive_field'),这相当于同一件事).