不想在django模型上进行内部连接

时间:2011-06-29 01:47:42

标签: django django-models inner-join

我已经迁移了一个我想使用django的现有数据库。我有以下型号:

class Device(models.Model):
    class Meta:
        db_table = u'DEVICES'
        managed=False
    id = models.CharField(primary_key=True, max_length=22, db_column='DEVICE_ID')
    name = models.CharField(max_length=40, db_column='DEVICE_NAME')
    status = models.CharField(max_length=10, db_column='STATUS')

class DevicePort(models.Model):
    class Meta:
        db_table = u'DEVICE_PORT'
        managed=False
    id = models.CharField( primary_key=True, max_length=22, db_column='DEVICE_PORT_ID')
    device = models.OneToOneField(Device, db_column='DEVICE_ID')
    type = models.CharField( max_length=22, db_column='PORT_TYPE_ID')
    port_num = models.CharField( max_length=30, db_column='DEVICE_PORT_NUM')

class IP(models.Model):
    class Meta:
        db_table = u'IP_NODE'
        managed=False
    ip_address = models.CharField(primary_key=True, max_length=15, db_column='IP_NODE_NO')
    hostname = models.CharField(max_length=40, db_column='IP_HOST')
    port = models.OneToOneField(DevicePort, db_column='DEVICE_PORT_ID')
    status = models.CharField(max_length=50, db_column='IP_NODE_STATUS')

我想要一个Devices及其关系IP.ip_addressIP.hostname的列表。在SQL中,我会做类似的事情:

SELECT UNIQUE
    d.device_name device
FROM 
    IP_NODE c, 
    DEVICES d, 
    DEVICE_PORT e
WHERE
    c.ip_node_no = b.ip_node_no 
  AND c.device_port_id = e.device_port_id 
  AND e.device_id = d.device_id 
  AND d.device_name LIKE 'something';

我如何使用我的django模型?

1 个答案:

答案 0 :(得分:1)

所以不是你想要的内连接......而是隐式连接?我在这里缺少一些东西,因为隐式连接比大多数情况下的显式连接慢。

[http://postgresql.1045698.n5.nabble.com/explicit-JOIN-faster-than-implicit-td1920335.html] [1]

我看不出你想要这样做的任何理由,但如上所述,你可以通过使用raw,甚至connection.cursor编写自己的查询来确定这一点。也许甚至可以用额外的(table = [...])来实现它,尽管我并不积极,因为我从未使用过这样的表格。