【问题标题】:Django ForeignKey on a View视图上的 Django ForeignKey
【发布时间】:2011-09-06 16:02:28
【问题描述】:

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

【问题讨论】:

  • 尝试将 db_column='node_id' 更改为 db_column='id'。我不确定,但 node_ 前缀可能是从 db_table 元选项中推断出来的
  • 底层实体视图实际上对节点的id引用为node_id;所以输入id 实际上失败了"Unknown column 'entity.id' in 'field list'"

标签: database django view foreign-keys


【解决方案1】:

您是否尝试过 .select_related() 在您的视图中?

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

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

【讨论】:

  • 不错 :) 这似乎奏效了!但是,有没有办法在模型定义中隐含地做到这一点?我觉得把它和我的观点混在一起有点不合时宜。干杯!
猜你喜欢
  • 1970-01-01
  • 2014-08-11
  • 2019-10-13
  • 2015-10-13
  • 2017-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多