Комментарии 6
cacheops очень крутой, я им как раз пользовался до этого, но все равно не хватало контроля за процессом инвалидации.

На кешопсе можно то же самое реализовать:


def get_comments(post):
    @cached_as(post, post.comments.all())
    def  _get_comments(post):
        return list(post.comments.all())
    return _get_comments(post)

Только это не нужно, т.к. оно так и сработает точно также автоматически.

Делал себе что-то похожее, только кеш навешивался через декоратор на методы уровня ваших get_comments(post_id), т.е. get и set делался внутри него и вызывался обёрнутый метод, если нужно, а cache_key генерился автоматически (на основании объекта метода + значений входящих args). Только инвалидация была описана сложнее, с помощью лямбд от моделей и нужных сигналов и условий инвалидации. Потому в итоге кода было примерно столько же, но он был декларативный, скажем так, а в методах оставалась чистая логика. Если заметите, у вас больше половины кода ваших методов — по сути повторяющийся код работы с кешем, я тоже сначала через похожие хелперы делал, но меня это раздражало)
Да, действительно, пишется много похожего кода get, if not — set, думаю сделать примерно такую функцию-хелпер:

def get_post(self, post_id):
    post = get_cached(
        key="post_detail_%s" % post_id,
        # сделать чтобы ключ был опциональным и генерировался при необходимости
        get_value=lambda: Post.objects.select_related('author').get(pk=post_id),
        # указываем выражение для получения значения
        get_depends_on=lambda post: [post, post.author],
        # указываем выражение для получения зависимостей с полученным значением в качестве аргумента
        timeout=10,
    )
    return post
Ну вот и у вас внезапно получился почти декоратор готовый)
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.