使用model& amp; Django select_related()进行多连接查询过滤器

时间:2009-05-10 19:15:33

标签: sql mysql django django-models left-join

我有两个型号:Job&位置:

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')

让我们说: 我有US / Calif / San-Fran,US / Calif / San_Jose,US / Calif / Alameda&美国/加州/奥克兰在我的数据库中。我还有经理/ Ebay / San-Fran,会计师/亚马逊/圣何塞,Coop / IBM / Oakland&导演/戴尔/阿拉米达。

另外:San-Fran本身就是大城市,而San-Jose,Alameda&奥克兰将San-Fran作为他们的大城市。

现在,当有人在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& Sons的所有工作。 SAN的圣何塞?

喜欢“向我展示所有位置都被其他位置引用的作业”。

这会被称为双连接吗?

理想情况下,我会使用lat-lon-radius(后期练习),但是现在我想知道如何使用双连接。

THX。

Vn44ca

1 个答案:

答案 0 :(得分:1)

这是一个应该做你想做的查询:

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

事实上,Django在运行此查询时在Location表上使用了两次连接:

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