Django:使用 select_related 缓存 RelatedObjects
Django: Caching RelatedObjects using select_related
我正在尝试使用 RelatedObjects 缓存 Django 模型对象。但是当我访问相关对象时,会触发一个查询。这是代码:
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 记录器中看到它。
问题:
我是做错了什么还是这是预料之中的?
缓存默认不包含RelatedObjects吗?那我应该单独缓存它们吗?
这与缓存无关;如果您在第一个视图中访问 obj.related.all()
,也会发生同样的事情。那是因为 select_related
对反向关系不起作用;为此你需要 prefetch_related
。
我正在尝试使用 RelatedObjects 缓存 Django 模型对象。但是当我访问相关对象时,会触发一个查询。这是代码:
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 记录器中看到它。
问题:
我是做错了什么还是这是预料之中的?
缓存默认不包含RelatedObjects吗?那我应该单独缓存它们吗?
这与缓存无关;如果您在第一个视图中访问 obj.related.all()
,也会发生同样的事情。那是因为 select_related
对反向关系不起作用;为此你需要 prefetch_related
。