我有两个模型:职位和地点:

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和US / Calif / Oakland。我也有经理/ Ebay / San-Fran,会计师/ Amazon / San-Jose,Coop / IBM / Oakland和总监/ Dell / Alameda。

另外:San-Fran拥有大城市,而San-Jose,Alameda和Oakland拥有San-Fran作为大城市。

现在,当有人在旧金山搜索所有工作时,我会进行类似的查询。

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


但是,我想允许按区域搜索,用户可以在其中搜索旧金山地区的所有职位。这将是San-Fran,Oakland,Alameda和San-Jose的所有工作吗?

就像“显示所有具有其位置的作业被其他位置引用”一样。

这将称为双联接吗?

理想情况下,我将使用lat-lon-radius(以后的锻炼),但是现在,我想知道如何通过两次联接来做到这一点。

谢谢。

Vn44ca

最佳答案

这是一个查询,应该执行您想要的操作:

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

09-19 20:03