2012-03-07 4 views
0

私は参加する必要のある2つのモデルがあります。これは非リレーショナル(外部キーなし)です。これらは私が変更できない他の開発者によって書かれたものです。ここでDjango 1.3の非リレーショナルモデルを2つのフィールドに結合する方法

は、それらの簡単な説明です:

モデルプロセス

  • フィールド名
  • フィールドパス
  • somethingelseフィールド
  • フィールドバー

モデルサービス

  • フィールド名
  • フィールドパス
  • フィールドサービス名
  • フィールドfooの

私は、ファイル名とパスの列にこれら二つのモデルのすべてのインスタンスに参加する必要があります。この結合が行われる前に、それぞれに適用する必要がある既存のフィルタがあります。

例:

A = Process.objects.filter(somethingelse = 231)

B = Service.objects.filter(FOO = 'ABC')

結果= A.filter(ファイル名= B.ファイル名、パス= B.path)

答えて

1

これはうんざりですが、最も良い方法は、1つのタイプのすべてのモデルを繰り返し、他のタイプの結合モデルを取得するクエリを発行することです。

また、未処理のSQLクエリを実行してこれらの結合を実行し、各モデルオブジェクトのIDを取得し、それに基づいて結合された各ペアを取得することもできます。実行時の方が効率的ですが、スキーマが進化する場合は手動で管理する必要があります。

+0

Djangoでこれを行うのはなぜ簡単なPostgresクエリを書くことができるのですか? – user451500

+0

@ user451500これはあなたのデータ間のこの関係についてdjangoに言わなかったので、djangoでは複雑です。一方、構造化されたデータを正確に処理するためのデータベースが存在し、データベースでは「オブジェクト」またはテーブル行ではなく結果行が得られます。あなたはデータ関係について何も知らないが、それらに参加して、あなたにオブジェクトを提供するシステムを求めています。これはもちろん可能ですが、特に一般的ではありません。私は代わりの解決策で私の答えを更新します。 – Marcin

関連する問題