2011-12-28 5 views
0

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

+0

Возможно, вам стоит попробовать переопределить метод Queryset ModelAdmin, чтобы он задерживал загрузку зашифрованного поля. Не совсем уверен в этом, но расскажи мне, как это происходит, если тебе так хочется. –

ответ

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'), что составляет то же самое).

+0

Это великолепно! Спасибо. –

+0

Мне просто интересно, где вы столкнулись с синтаксисом «self.model._default_manager.only»? Я искал его и искал документы Django, и мне не удалось найти ссылку на «.only», есть ли секретное общество Django, о котором я не знаю, учит этому темному искусству? :-) –

+0

:-) '_default_manager' недокументирован, насколько я знаю, но' only' является стандартным методом набора запросов: см. Https://docs.djangoproject.com/en/1.3/ref/models/querysets/# только –

Смежные вопросы