django при использовании запроса к кешированной базе данных - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть django приложение, которое сохраняет трафик c журналы. проблема заключается в том, что когда мы обновляем страницу sh, новые журналы не отображаются, например, набор запросов, кешированный где-то. Я сделал менеджер для возврата последнего n журнала.

это мой код

from django.db.models import Manager 

class LogMannager(Manager):
    def _last(self,num,server=None,camera=None):
        if  camera:
            return self.get_queryset().filter(camera=camera).order_by('-id')[:num]
        elif server:
            return self.get_queryset().filter(server=server).order_by('-id')[:num]
        else:
            ret = self.get_queryset().all().order_by('-id')[:num]
            print(ret)
            return ret

сервер работает и использует обновление uwsgi

:

это где я использую:

class MainKioskView(MainMixin, generic.TemplateView):
    template_name = 'monitoring/main_kiosk.html'
    log = Log.objects._last(30)
    all_server = Server.objects.all()
    servers = [[server, Log.objects.filter(server=server).last(), ActiveCamera.objects.filter(server=server)] for server
               in all_server]
    extra_context = {'logs': log, 'servers': servers}

1 Ответ

0 голосов
/ 05 апреля 2020

После оценки набора запросов он сохраняет результат в виде своего рода кеша, поэтому повторение по нему несколько раз не вызывает вызов БД каждый раз. log и extra_context являются атрибутами класса, поэтому каждый экземпляр вашего представления получает один и тот же, уже оцененный набор запросов при каждом запросе.

Вам необходимо каждый раз создавать новый набор запросов и удалять эти атрибуты класса. То же самое и для servers тоже скорее всего

def get_context_data(self, **kwargs):
    context_data = super().get_context_data(**kwargs)
    context_data['logs'] = Log.objects._last(30)
    return context_data
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...