2011-06-29 8 views
0

djangoで作業したい既存のデータベースを移行しました。私は次のモデルがあります: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') 

iは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モデルでこれを行うのですか?

+3

よろしくお願いします。 *なぜ* INNER JOINを使用したくないのですか? –

+0

ORMに使用されているステートメントを指示させるのではなく、いつでも独自のSQLステートメントを実行できます。https://docs.djangoproject.com/en/1.3/topics/db/sql/ – Brandon

答えて

1

内部結合の代わりに、暗黙的結合が必要ですか?明示的な結合よりも暗黙的な結合がほとんどすべての場合より遅いので、私がここで紛失しているものがありますか?

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

私はあなたが望むどのような理由を見ることができませんこれを行うには、上で述べたように、raw、あるいはconnection.cursorを使って独自のクエリを書くことで確実にこれを得ることができます。私はこのようなテーブルを使ったことがないので、私は肯定的ではありませんが、多分余分なもの(テーブル= [...])でそれを取り除くことさえできます。

+0

リンクに感謝します。かなり興味深い...とにかく、私は少し質問を言い換えるべきではないかと思う:私の問題は、私が別々の 'Device'sとそれらに関連する' IP'sを望んでいるということです - 'Device'は' DevicePort' 'IP'も、どうやって進めるのか分かりません。歓声、 – yee379

+0

私はあなたが何を話しているのか分からない。あなたのコードで 'Device'と' DevicePort'の関係は非常にクリアです。 –

関連する問題