to_python вызывается каждый раз, когда данные загружаются из БД - PullRequest
0 голосов
/ 29 декабря 2011

У меня есть различные поля базы данных, которые расшифровываются с помощью метода to_python.У меня проблема в том, что каждый раз, когда я получаю доступ к разделу администратора (список admin.ModelAdmin) для этой конкретной модели, страница загружается очень долго.Мне не нужен метод to_python для расшифровки полей на странице списка, поскольку поля или столбцы, которые я перечисляю, вообще не зашифрованы.Когда пользователь щелкает элемент, чтобы отредактировать его, включается метод to_python, что вполне нормально, как и предполагалось.Однако как я могу остановить метод to_python, пытающийся расшифровать объекты при перечислении их, учитывая, что представление списка показывает только поля, которые не зашифрованы?Кроме того, это заставляет фильтр работать очень медленно.Опять же, фильтрация выполняется только по незашифрованным полям, поэтому не нужно, чтобы метод to_python выполнялся сам.

1 Ответ

5 голосов
/ 29 декабря 2011

Таким образом, проблема в том, что администратор загрузит весь экземпляр модели для каждой строки, даже если вы отображаете только несколько полей. Решение должно состоять в том, чтобы переопределить метод 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'), что равносильно тому же).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...