Django:使用select_related缓存RelatedObjects

时间:2015-12-18 10:08:38

标签: django caching django-models memcached django-select-related

我正在尝试使用RelatedObjects缓存Django Model对象。但是当我访问相关对象时,会触发查询。这是代码:

class Main(models.Model):
    name = models.CharField('Name', max_length=100)

class Related(models.Model):
    main = models.ForeignKey(Main, related_name="related")
    name = models.CharField('Name', max_length=100)

def cache_main_with_related():
    obj = Main.objects.select_related('related').get(name="abc")
    cache.set('cache:abc', obj)  # I want related also to get cached

def access_cache():
    cached_obj = cache.get('cache:abc')
    print cached_obj.name  # No query fired
    print cached_obj.related.all()  # This fires a DB query even though abc is cached after select_related

因此,当我访问缓存对象的相关对象时,数据库会被命中。我在django.db.backends记录器中看到它。

问题:

  1. 我做错了什么或是预期的?

  2. 默认情况下缓存不包含RelatedObjects吗?我应该单独缓存它们吗?

1 个答案:

答案 0 :(得分:1)

这与缓存无关;如果您在第一个视图中访问obj.related.all(),则会发生同样的事情。这是因为select_related并不适用于反向关系;你需要prefetch_related