关于视图的Django ForeignKey

时间:2011-06-01 21:29:52

标签: database django view foreign-keys

我正在从现有数据库构建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),所以我可以使用它,但我希望关系存在。

1 个答案:

答案 0 :(得分:0)

你在视图中尝试.select_related()吗?

entities = Entity.objects.select_related('device').filter(...)

另一方面,如果它是和旧的数据库,并且没有由django自动生成,可能node_id可能不是数据库中的索引,这将减慢很多任何JOIN。