【问题标题】:Django: Caching RelatedObjects using select_relatedDjango:使用 select_related 缓存相关对象
【发布时间】:2016-03-25 00:15:22
【问题描述】:

我正在尝试使用相关对象缓存 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 记录器中看到它。

问题:

  1. 是我做错了什么还是意料之中?

  2. 缓存是否默认不包括相关对象?那我应该单独缓存它们吗?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 有效!所以 select_related 遵循正向 ForeignKey 引用,而不是反向。现在明白了!谢谢!
    猜你喜欢
    • 2021-12-31
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多