我正在从现有数据库构建django应用程序。无论好坏,我有几个观点,我想基于我的模型。他们看起来像这样:
class Device(Model):
id = models.IntegerField( primary_key=True, db_column='node_id' )
name = models.CharField(max_length=127, db_column='node' )
class Meta:
db_table = 'node' # db view
managed = False
class Entity(Model):
id = models.IntegerField( primary_key=True, db_column='_id' )
device = models.ForeignKey(Device, db_column='node_id' )
class Meta:
db_table = 'entity' # db view
managed = Fase
所以事情还可以。但是,当我尝试使用一个使用ForeignKey的模板时,它非常慢:
{% for e in entities %}
{{ e.device.name }}
{% endfor %}
查看日志,它似乎是为每个'node_id'重复查询,并最终超时。
(当然,如果我不包括e.device.name
就快了)
有没有办法可以优化它?
公平地说,'实体'视图已经将设备的名称作为另一个字段(node
),所以我可以使用它,但我希望关系存在。
答案 0 :(得分:0)
你在视图中尝试.select_related()吗?
entities = Entity.objects.select_related('device').filter(...)
另一方面,如果它是和旧的数据库,并且没有由django自动生成,可能node_id可能不是数据库中的索引,这将减慢很多任何JOIN。