2011-06-01 60 views
1

我从现有的数据库构建Django应用程序。无论更好还是更糟糕,我都有一些意见,我想基于我的模型。他们看起来像这样: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

尝试更改** db_column ='node_id'**到** db_column ='id'**。我不确定,但是可以从** db_table **元选项 – 2011-06-01 21:36:39

+0

推断出** node _ **前缀,底层实体视图实际上具有对节点的id引用作为'node_id';所以把'ID'实际上失败与'“未知列'entity.id'在'字段列表''' – yee379 2011-06-01 23:59:40

回答

0

你有没有在你的视图中尝试.select_related()?

entities = Entity.objects.select_related('device').filter(...) 
在另一方面

,如果是老的数据库,并通过Django的自动生成没有,大概NODE_ID可能无法在数据库索引,这会减慢了很多的任何连接。

+0

好:)这似乎工作!然而,在模型定义中隐含地做到这一点?我觉得有点混乱,将它与我的观点混合在一起。干杯! – yee379 2011-06-02 00:02:51