我有两个模型:职位和地点:
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