Django rest - понять кешированные результаты

У меня медленные запросы в моем проекте Django restframework.

Многие вложенные сериализаторы вызывают медленные HTTP-запросы (2-5 секунд).

Поэтому я подумал об использовании кеша, который Django может предоставить с Memcache server.

Но, боюсь, я не совсем понимаю его поведение. Что произойдет, если клиент будет запрашивать один и тот же запрос нон-стоп каждую 1 секунду, и вдруг один из объектов изменится? Получит ли пользователь кешированные результаты или Django вернет кешированные результаты с конкретным изменением?


person Oz Bar-Shalom    schedule 18.05.2017    source источник
comment
Сначала оптимизируйте конечные точки перед кэшированием. Вы оптимизировали свой запрос к БД? Используйте панель инструментов отладки Django и .select_related('some_relation'), чтобы уменьшить число обращений к базе данных и ускорить работу вашей конечной точки. Вы также можете разделить свои сериализаторы на перечисление сериализаторов (минимально вложенных) и подробных сериализаторов (все необходимые связанные объекты).   -  person allcaps    schedule 18.05.2017
comment
уже сделал. Запрос элементов основного списка должен быть детализирован с помощью вложенных сериализаторов :(   -  person Oz Bar-Shalom    schedule 18.05.2017
comment
Итак, на панели инструментов отладки django нет повторяющихся запросов?   -  person allcaps    schedule 18.05.2017
comment
тем не менее там есть работа. Но мой главный вопрос был о кеше. после того, как я сделал с оптимизацией   -  person Oz Bar-Shalom    schedule 18.05.2017
comment
Действительно, используйте кеш в крайнем случае. Мне никогда не приходилось использовать его, так как правильное использование связанных с выбором решило мои проблемы с медленными конечными точками. Также вы утверждаете, что необходимо много вложенных сериализаторов, но я в это не верю. Пакетная обработка, множественные вызовы, множественные конечные точки и т. д. – это способы ускорить работу API. Да, это требует некоторой работы на стороне клиента, но ни человеку, ни системе не нужны все данные постоянно.   -  person allcaps    schedule 18.05.2017


Ответы (1)


Django не управляет кэшированными данными автоматически. Вы должны управлять им самостоятельно.

Существует несколько подходов к управлению кэшированными данными на основе всей логики вашего приложения.

  • вы можете использовать сигналы django для отслеживания изменений объекта

https://docs.djangoproject.com/en/1.11/ref/signals/#module-django.db.models.signals

  • вы можете переопределить методы сохранения и удаления модели
def save(self, *args, **kwargs):
    super(MyModel, self).save(*args, **kwargs)
    cache.set(str(self.pk), pickle.dumps(self))
  • вы можете использовать общие представления DRF для сохранения и удаления:

методы Perform_create, Perform_update и Perform_delete

def perform_update(self, serializer):
    obj = serializer.save()
    cache.set(str(obj.pk), pickle.dumps(obj))

http://www.django-rest-framework.org/api-guide/generic-views/#genericapiview

для приложений на основе API я предпочитаю использовать общие хуки представления.

person zaphod100.10    schedule 19.05.2017