我有以下型号:
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__()
想要的所有信息?
答案 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