Django: Как мне использовать Cache Machine для кэширования модели, которая использует GeoManager?

Я использую Cache Machine Cache Manager на своих негеографических моделях, используя образец в документах:

from django.db import models

from caching.base imoprt CachingManager, CachingMixin

class Zomg(CachingMixin, models.Model):
    val = models.IntegerField()

    objects = CachingManager()

Но у меня есть несколько моделей, содержащих типы полей GeoDjango, и поэтому я должен использовать GeoManager, например

class RecordArea(models.Model):
    polygon = models.MultiPolygonField(srid=4326)
    name = models.CharField(max_length=100)
    ...
    objects = models.GeoManager()

Как я могу интегрировать этих двух менеджеров в свои географические модели? Я на Django 1.5 / Python 2.7.5.

Это указывает на переопределение CachingManager, которое я получаю, но документы Cache Machine заставляют меня думать, что мне нужно убедиться, что QuerySet кэшируется, то есть становится CachingQuerySet:

вернуть CachingQuerySet из метода get_query_set другого менеджера вместо создания подкласса CachingManager

1 ответ

Создайте свой собственный менеджер, который наследуется от GeoManager и возвращает CachingQuerySet:

В myapp/manager.py:

from django.contrib.gis.db.models import GeoManager
from caching.base import CachingQuerySet

class MyModelManager(GeoManager):
    """
    A custom manager for myapp models.
    """
    def get_queryset(self):
        return CachingQuerySet(self.model, using=self._db)

В myapp/models.py:

from django.contrib.gis.db import models
from caching.base import CachingMixin
from .manager import MyModelManager

class MyModel(CachingMixin, models.Model):
    something = models.CharField()

    objects = MyModelManager()

И у тебя есть кешируемая модель.

Другие вопросы по тегам