2009-05-10 8 views
1

J'ai deux modèles: Job & Lieu:Django select_related() pour la requête multi-jointure à l'aide du modèle et les filtres

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

Disons que: Je US/Californie/San-Fran, Etats-Unis/Californie/San_Jose, États-Unis/Californie/Alameda & US/Calif/Oakland dans ma base de données. J'ai aussi Manager/Ebay/San-Fran, Comptable/Amazon/San-Jose, Coop/IBM/Oakland & Directeur/Dell/Alameda.

En outre: San-Fran a lui-même comme big_city, tandis que San-Jose, Alameda & Oakland ont San-Fran comme leur grande ville.

Maintenant, je fais une requête comme celle-ci quand quelqu'un est à la recherche de tous les emplois à San-Fran.

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

Cependant, je voudrais permettre la recherche par région où l'utilisateur peut rechercher tous les emplois à San-Fran Région. Ce serait tous les emplois à San-Fran, Oakland, Alameda & San-Jose? Comme "Montrez-moi tous les travaux qui ont leur emplacement est la référence par d'autres emplacements".

Cela s'appellerait-il une double jointure?

Idéalement, j'utiliserais lat-lon-radius (exercice plus tard), mais pour l'instant je veux savoir comment le faire avec une double jointure.

Thx.

Vn44ca

Répondre

1

Voici une requête qui devrait faire ce que vous voulez:

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

Et en effet, Django utilise une jointure deux fois sur la table d'emplacement lors de l'exécution de cette requête:

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

Ne doit pas être: Job.objects.filter(). Selected_related ('Location') ou était-ce supposé? Si oui, devons-nous en mettre deux: .selected_related ('Location'). Selected_related ('Location') pour indiquer une double jointure? Si oui, que se passe-t-il si la classe A a B comme FK et la classe B a C comme FK et que vous voulez effectuer une jointure double, alors serait-ce: A.objects.filter(). Selected_related ('B'). Selected_related ('C') Merci Ayman – un33k

+1

select_related() est recommandé si vous prévoyez d'accéder aux champs ForeignKey dans le QuerySet résultant. Un seul appel sans args est nécessaire; select_query() suit autant que possible les clés étrangères. Donc, si vous voulez accéder au champ d'emplacement dans le résultat, utilisez select_related(). –

Questions connexes