не хочу внутренних соединений на моделях Django - PullRequest
0 голосов
/ 29 июня 2011

Я перенес существующую базу данных, с которой хотел бы работать с 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_address и IP.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 Ответ

1 голос
/ 29 июня 2011

То есть вместо внутреннего соединения вы хотите ... и неявного соединения? Есть ли что-то, чего я здесь упускаю, потому что неявное соединение медленнее, чем явное, в большинстве случаев.

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

Я не вижу причин, по которым вы хотели бы сделать это, но, как указано выше, вы можете наверняка получить это, написав свои собственные запросы с использованием raw или даже connection.cursor. Может быть, даже мог бы справиться с дополнительным (таблицы = [...]), хотя я не уверен, потому что я никогда не использовал такие таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...