缓存引用相关对象的__unicode__调用的Django查询结果

时间:2009-12-20 04:21:52

标签: django django-forms

我有以下型号:

class Territory(models.Model):
    name = models.CharField(max_length=30)
    power = models.ForeignKey(Power, null=True, blank=True)
    is_supply = models.BooleanField()

class Subregion(models.Model):
    territory = models.ForeignKey(Territory)
    subname = models.CharField(max_length=10, blank=True)
    sr_type = models.CharField(max_length=1, choices=SUBREGION_CHOICES)
    init_unit = models.BooleanField()
    borders = models.ManyToManyField("self", null=True, blank=True)

    def __unicode__(self):
        if self.subname:
            return u'%s (%s)' % (self.territory.name, self.subname)
        else:
            return u'%s [%s]' % (self.territory.name, self.sr_type)

问题在于,在呈现ModelFormSet时,其中每种形式包含3个ModelChoiceFields,其中包含所有120 Subregions,每个SELECT生成一个Subregion个查询1}}在每个小部件中。根据我的Postgres日志,正在为一个简单的3格式表单集生成1000多个查询,对页面加载时间有明显影响。

那么,有没有合理的方法来执行一个大型查询来缓存Subregion.__unicode__()想要的所有信息?

1 个答案:

答案 0 :(得分:1)

您是否尝试过使用select_related()?这将帮助您对territory.name进行额外的查找。将跳过边框,因为select_related()的默认值是不遵循null = True的外键。如果您还需要获取边框,可以尝试明确相关对象的名称:Subregion.objects.select_related('territory', 'borders').all()

在您的应用./manage.py shell中进行旋转,看看select_related()是否有帮助:

>>> from django import db
>>> db.reset_queries()
>>> Subregion.objects.all()
# ...
>>> len(db.connection.queries)
# some big number
>>> db.reset_queries()
>>> Subregion.objects.select_related().all()
# ...
>>> len(db.connection.queries)
# a smaller number