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

时间:2011-12-28 20:39:15

标签: python django django-admin

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

1 个答案:

答案 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'),这相当于相同的事情。)