2009-05-10 14 views
1

を用いたマルチジョイン・クエリのために私は2つのモデル持っDjangoは(select_related)モデル&フィルター

class Job(models.Model): 
    title = models.CharField(max_length=20) 
    company = models.CharField(max_length=20) 
    location = ForeignKey('Location') 

class Location(models.Model): 
    country = models.CharField(max_length=20) 
    state = models.CharField(max_length=20) 
    city = models.CharField(max_length=20) 
    latitude = models.FloatField(blank=True, default=0.0) 
    longitude = models.FloatField(blank=True, default=0.0) 
    big-city = ForeignKey('Location') 

をさんが言ってみましょう: 私はアメリカ/カリフォルニア/サン・フランを持って、米国/カリフォルニア州/ San_Jose、US/Calif/Alameda & US/Calif/Oaklandデータベース。また、マネージャー/ Ebay/San-Fran、Accountant/Amazon/San-Jose、Coop/IBM/Oakland & Director/Dell/Alamedaもあります。

またSan-Franはbig_cityとして、またSan-Jose、Alameda &オークランドは大都市としてSan-Franを持っています。

誰かがサンフランのすべての仕事を探しているときに、私はこのような質問をします。

Job.objects.filter(
location__country='US', 
location__state='Calif', 
location__city='San-Fran').selected_related('Location') 

しかし、San-Fran Regionのすべてのジョブを検索できる地域別の検索を許可したいと考えています。これはSan-Fran、Oakland、Alamedaのすべての仕事になります& San-Jose?

「自分の場所を持つすべてのジョブを他の場所で参照していることを表示する」のように

これをダブルジョインと呼びますか?

理想的には、私はlat-lon-radiusを使用していますが(後での演習)、今はダブルジョインでどのように行うかを知りたいと思います。

Thx。ここで

Vn44ca

答えて

1

は、あなたが欲しいものを行う必要がありますクエリです:

Job.objects.filter(location__big_city__city='San-Fran', location__big_city__state='Calif', location__big_city__country='USA') 

そして実際、Djangoはこのクエリを実行するときに場所のテーブルの上に二回の参加を使用しています。

SELECT "example_job"."id", "example_job"."title", "example_job"."company", "example_job"."location_id" FROM "example_job" INNER JOIN "example_location" ON ("example_job"."location_id" = "example_location"."id") INNER JOIN "example_location" T3 ON ("example_location"."big_city_id" = T3."id") WHERE (T3."country" = USA AND T3."city" = San-Fran AND T3."state" = Calif 
+0

: Job.objects.filter()。選択された関連( '場所') またはそれが仮定されましたか? もしそうなら、これらのうちの2つを置く必要がありますか:.selected_related( 'Location')。chosen_related( 'Location') 二重結合を示しましたか? もしクラスAがFKとしてBを持ち、クラスBがFKとしてCを持ち、ダブル・ジョインを実行したいのであれば、A.objects.filter()。selected_related( 'B')。 ( 'C') ありがとうAyman – un33k

+1

結果のQuerySetのForeignKeyフィールドにアクセスする場合は、select_related()をお勧めします。 argsのない呼び出しは1つだけ必要です。 select_query()はできるだけ外部キーに従います。したがって、結果の場所フィールドにアクセスする場合は、select_related()を使用します。 –

関連する問題