У меня есть веб-сервер Django с базой данных postgresql.
У меня есть представление (структура Django REST), которое демонстрирует странное поведение.
В представлении указывается дата самой последней записи в таблице. Записи последовательно добавляются несколько раз в минуту в эту таблицу. В этом представлении не реализовано кэширование.
Сегодня я заметил следующее:
- представление на рабочем сервере возвращало устаревшие данные (последние данные 2 дня назад)
- просмотр на локальном сервере разработки (подключается к той же удаленной базе данных) вернул свежие данные
- просмотр в
./manage.py shell
запуск на рабочем сервере возвратил свежие данные
- Я не перезагружал производственный сервер 2 дня назад
- После перезагрузки производственного сервера сегодня данные снова обновляются
- 30 минут спустя, данные устарели на 30 минут
Что может быть причиной этого? Почему мне пришлось обновить соединение с базой данных, чтобы получить свежие данные?
Соответствующий код:
# models.py
class MyModel(models.Model):
name = models.CharField(max_length=255)
def get_data(self,
start_date=timezone.now()-timedelta(hours=24),
end_date=timezone.now()):
latest_data = self.data.filter(date__gte=start_date, date__lte=end_date).latest('date')
return {
'latest': latest_data.date
}
class MyOtherModel(models.Model):
date = models.DateTimeField()
foreign_key = models.ForeignKey(MyModel, related_name='data')
# views.py
class MyView(generics.ListAPIView):
serializer_class = MySerializer
def get_queryset(self):
queryset = MyModel.objects.all()
# serializers.py
class MySerializer(serializers.ModelSerializer):
data = serializers.DictField(source="get_data")
class Meta:
model = MyModel
fields = ('data',)
Метод get_data
возвращает устаревшие данные при вызове в сериализаторе представлений от рабочих-оружейников. Данные устарели на дату запуска рабочих.
Метод get_data
не возвращает устаревшие данные при вызове из нового рабочего процесса или нового экземпляра оболочки.