2015-10-08 5 views
1

У меня проблема, когда мой производственный сервер отображает неверные результаты для запроса (для создания и удаления были правильно учтены, но не обновлены существующие поля, которые повлияли на результаты). Я предположил, что это проблема с сопоставлением дат и провела несколько часов отладки, поскольку я не смог воспроизвести ошибку на dev. В конце концов, я перезапустил пулемет, и проблема исчезла. Кажется, что postgresql или django кэшировали результаты запроса. Я не настраивал кеширование, поэтому не понимаю, почему это происходит.Проблемы с кешированием с django или postgresql

У меня есть 2 вопроса пожалуйста:

  1. Кто делает кэширование?
  2. Как отключить его? - Мне нужно QuerySet , чтобы оценить каждый раз, когда она называется

Setup

Python 2.7

Джанго 1,7

PostgreSQL

Ubuntu

views.py Экстракт

class EventList(ListView, FilterMixin): 
    model = Listing 
    queryset = Listing.events.order_by('-from_date',) 

models.py Экстракты

class Listing(models.Model): 
    title = models.CharField(max_length=200, null=True) 
    to_date = models.DateTimeField(null=True, blank=True) 
    from_date = models.DateTimeField(null=True, blank=True) 
    events = EventManager() 
    event = models.ForeignKey('Event', related_name='listings', null=True, blank=True, on_delete=models.SET_NULL) 

class EventManager(models.Manager): 
    def get_queryset(self): 
     now = arrow.now() 
     # Only listings which have events ending after today 
     qry = super(EventManager, self).get_queryset().filter(event__isnull=False).select_related('event').filter(to_date__gte=now.datetime) 
     return qry 
+0

Пожалуйста, ваши модели и просматривать код. – Brandon

+0

Это вряд ли будет кэшировать или что-то делать с базой данных; скорее всего, будет запросом, оцененным на уровне класса или модуля. Но мы не можем помочь, не видя кода. –

+0

@ DanielRoseman См. Обновленный вопрос. Проблема, с которой я сталкиваюсь, заключается в том, что когда листинг списывается, to_date устанавливается за 1 день до сегодняшнего дня, но набор запросов (тот, который в EventManager) продолжает возвращать его до перезапуска пушки. Спасибо за помощь – RunLoop

ответ

7

Это похоже на проблему оценки времени импорта (что в некотором роде является проблемой сравнения даты, как вы сказали).

Что происходит, когда ваш views.py модуль импортирован, queryset член EventList класса оценивается. Результатом является пример QuerySet, который был рассчитан во время импорта. Таким образом, часть .filter(to_date__gte=now.datetime) фактически выполняется правильно, и поэтому дата на самом деле всегда одна и та же (дата во время импорта).

При вызове вида все django за кулисами должно добавить .all() к набору запросов, чтобы заставить новую оценку запроса. Но поскольку фильтр datetime был фактически оценен при загрузке модуля, он всегда будет фильтроваться к той же дате. Например, если вы вставляете новые списки, датированные до перезапуска сервера, я ожидаю, что вы получите эти новые результаты!

Для таких случаев, когда требуются динамическая фильтрация, вы должны переопределить метод ListPageView.get_queryset вместо того, чтобы обеспечивать оценку времени выполнения:

class EventList(ListView, FilterMixin): 
    def get_queryset(self): 
     return Listing.events.order_by('-from_date') 
+1

Удалили мой ответ. Этот ответ имеет смысл. – iankit

+0

Спасибо @iankit. Я бы не удалял ответ, хотя ваш поток отладки/тестирования мог помочь кому-то с подобными проблемами - тем более, что, в отличие от заголовка, это не кажется реальной проблемой кэширования! – ppetrid

+0

Да, это общий ответ. Страх, я мог бы получить вниз. ! – iankit

0

Если у вас нету добавил слой кэша, это невозможно, что Django имеет кэширование. Это не выходит из коробки в Django. Вы должны искать в другом месте основную причину проблемы. С частичным кодом, который вы указали, невозможно предсказать возможные причины.

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

  1. Является ли производственный сервер размещенным в разных часовых поясах?

  2. В чем отличия в окружающей среде prod и dev и окружающей среде?

  3. Какие изменения при перезапуске пушки?

  4. Если поверхность ошибки снова появляется на производстве, сколько времени потребовалось, чтобы вернуться. Можете ли вы добавить события журнала на производство с помощью таких инструментов, как logstash и kibana.

  5. Язык Python имеет некоторые неинтуитивные аспекты обработки данных даты. Вы можете прочитать больше об этом, одна статья здесь. - https://opensourcehacker.com/2008/06/30/relativity-of-time-shortcomings-in-python-datetime-and-workaround/, Python date function bugs

Эти общие стратегии, которые вы можете использовать, чтобы выяснить причину.

+0

Это не точный ответ. См. Другой ответ. Я не удаляю этот ответ, потому что это может помочь людям в отладке таких проблем в целом. – iankit

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