Django - Ленивые результаты с контекстным процессором - PullRequest
0 голосов
/ 12 февраля 2011

Я работаю над проектом django, который требует, чтобы большая часть общих данных страницы была динамичной. Вещи, которые появляются на каждой странице, такие как номер телефона, адрес, адрес электронной почты основного контактного лица и т. Д., Должны быть доступны для редактирования через панель администратора, поэтому их сохранение в файле settings.py не будет работать.

Чтобы обойти это, я создал пользовательский контекстный процессор, который действует как абстрактная ссылка на мою модель «Live Settings». Модель выглядит так:

class LiveSetting(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=255, blank=False, null=False)
    description = models.TextField(blank=True, null=True)
    key = models.CharField(max_length=100, blank=False, null=False)
    value = models.CharField(max_length=255, blank=True)

А контекстный процессор вот так:

from livesettings.models import LiveSetting

class LiveSettingsProcessor(object):
    def __getattr__(self, request):
        val = LiveSetting.objects.get(request)
        setattr(self, val.key, val.value)
        return val.value

l = LiveSettingsProcessor()

def livesetting_processors(request):
    return {'settings':l}

Это работает очень хорошо, и в моем шаблоне я могу использовать {{settings.primary_email}} и получить соответствующее значение из базы данных.

Проблема с приведенным выше кодом заключается в том, что он обрабатывает каждый живой запрос настроек отдельно и будет попадать в базу данных каждый раз, когда мой тег {{settings. *}} Используется в шаблоне.

У кого-нибудь есть идеи, если бы я мог сделать этот процесс ленивым, поэтому вместо того, чтобы извлекать значение и возвращать его, он вместо этого обновляет QuerySet, а затем возвращает результаты одним попаданием непосредственно перед визуализацией страницы?

Ответы [ 2 ]

2 голосов
/ 12 февраля 2011

Вы пытаетесь изобрести что-то сложное, и это не причина для этого. Что-то такое простое, как это, будет работать достаточно хорошо:

def livesetting_processors(request):
    settings = LiveSetting.objects.get(request)
    return {'settings':settings}

EDIT:

Вот как вы решите свою проблему в текущей реализации:

class LiveSettingsProcessor(object):
    def __getattr__(self, request):
        val = getattr(self, '_settings', LiveSetting.objects.get(request))
        setattr(self, val.key, val.value)
        return val.value

@ Hanpan, я обновил свой ответ, чтобы показать, как вы можете решить свою проблему, но я хочу сказать, что то, чего вы пытаетесь достичь, не дает практической победы, однако увеличивает сложность и требует ваше время. Также может быть сложнее настроить кеш на все это позже. А с включенным кэшированием это вообще не даст никаких улучшений в производительности.

Не знаю, слышали ли вы это раньше: преждевременная оптимизация - корень зла. Я думаю, что эта тема на SO полезно читать: https://stackoverflow.com/questions/211414/is-premature-optimization-really-the-root-of-all-evil

1 голос
/ 12 февраля 2011

Может быть, вы могли бы попробовать Кеширование Джанго ?

В частности, вы можете воспользоваться функцией низкоуровневого кэширования . Кажется, что это будет гораздо меньше работы, чем вы планируете.

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