【问题标题】:Django: How do I use Cache Machine to cache a model that uses GeoManager?Django:如何使用 Cache Machine 缓存使用 GeoManager 的模型?
【发布时间】:2023-09-07 23:50:01
【问题描述】:

我正在使用pattern in the docs 的非地理模型上使用缓存机器的缓存管理器:

from django.db import models

from caching.base imoprt CachingManager, CachingMixin

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

    objects = CachingManager()

但我有几个包含 GeoDjango 字段类型的模型,因此 must use 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 上。

This 指向覆盖 CachingManager,我得到了,但 Cache Machine 文档让我认为我需要确保 QuerySet 被缓存,即成为 CachingQuerySet:

从其他管理器的 get_query_set 方法返回一个 CachingQuerySet 而不是继承 CachingManager

【问题讨论】:

    标签: django geodjango django-cache-machine


    【解决方案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()
    

    你得到了一个可缓存的模型。

    【讨论】:

      最近更新 更多