在ForeignKey上使用`defer`或`only`

时间:2014-08-18 09:38:17

标签: django

我试图从视图中挤出几毫秒。我想避免从我不会使用的ForeignKey模型中加载一些非常大的文本字段。

更清楚:

class Foo(models.Model):
    slug = models.SlugField()
    text1 = models.TextField()
    text2 = models.TextField()
    ...

    @models.permalink
    def get_absolute_url(self):
        return ('foo_detail', (), {"object_id": self.pk, "object_slug": self.slug})


class Bar(models.Model):
    foo = models.ForeignKey(Foo)
    ...

然后在模板中:

 {% for bar in bars %}
      {{ bar.foo.get_absolute_url }}
 {% endfor %}

现在,如果您查看orm发出的查询,对于每个foo,Django会检索每个字段(按预期方式),但最终只需要pkslug 。就我而言,在我的测试机上,每个对象的总和大约相当于百分之一秒。

当然我可以写一个像这样的方法:

class Bar(models.Model):
    ...
    def get_foo_absolute_url(self):
        return Foo.objects.only('pk', 'slug').get(pk=self.foo).get_absolute_url()

并在模板中使用它,但它很丑陋。

有没有人遇到同样的问题并想出更好的解决方案?

1 个答案:

答案 0 :(得分:0)

我们有类似的问题,但我们转移到另一个解决方案 - 在memcache / state缓存中缓存的URL或在模型字段中预先计算。

我们测试了 models.permalink 所做的网址反向正在降低性能。