2009-05-08 8 views
1

J'ai une application appelée Location. Emplacement a Pays, État, Ville, Big_City_Nearby, Longitude, latitude.Django - ForeignKey() utilise une colonne différente de l'ID de ligne?

J'ai une application pour un article à vendre. L'article a Titre, Lien, Description, Prix & Emplacement qui est un ForeignKey(). Maintenant, si quelqu'un veut voir tous les articles à vendre aux États-Unis, il clique sur un lien (disons http://example.com/United-States/) et l'URL passera aux États-Unis comme pays avec l'état, la ville et big_city_nearby vide.

#in view.py 
class by_location(request, country, state, city, big_city_nearby) 
    location = Location.objects.filter(country=country, state=state, city=city, big_city_nearby=big_city_nearby) 
    items = Items.objects.filter(location__in=[location.id for loc in location]) 
    return render_to_response('item/by_location.html', {"items":itmes, "country":countyr, "cit":city, "nearby":big_city_nearby}) 

Il n'y a pas de problème si elles passent (http://example.com/United_State/California/Oakland) que je peux aller de l'avant et la liste de tous les articles à Oakland sans avoir besoin d'afficher l'emplacement par objets trouvés. Le problème est lorsque la sélection http://example.com/United_States/ ou http://example.com/United_States/California/. Comme je dois maintenant afficher l'emplacement de chaque élément que les éléments peuvent être de différentes villes. Par conséquent, lorsque le modèle reçoit la liste d'éléments, il reçoit uniquement la clé étrangère (emplacement) dans chaque élément. Je peux mettre en place une autre boucle, où chaque élément est examiné et l'objet Location est récupéré et placé dans un tuple avec l'objet item. Mais ce serait très inefficace sur SQL. Comme je devrais frapper la base de données pour chaque élément trouvé pour obtenir l'objet d'emplacement réel.

Existe-t-il un moyen de dire que ForeignKey maintient la ville au lieu de l'Id à la ligne de l'emplacement dans la base de données. Pour simplifier la question: existe-t-il une meilleure façon de quitter l'emplacement en tant qu'application, sans devoir fournir le pays, l'état, la ville, etc.? dans chaque rangée d'article.

Thx,

VN44CA

Répondre

2

Item.objects.filter(...).select_related("location"). Cela va JOINDRE à la table des emplacements, donc ce sera juste une requête.

Encore mieux, Item.objects.filter(location__country=country, location__state=state).select_related("location") et vous pouvez omettre entièrement la requête Location. Honnêtement, j'ai de la difficulté à trouver si c'est tout ce dont vous avez besoin, mais cela gère le problème des requêtes O (N).

+0

Vous permettez aux gens de vendre des choses sur votre site. La personne A vend uniquement l'article A aux États-Unis/CA/Oakland, la personne B vend uniquement l'article B en US/CA/* et la personne C vend l'article C en US/*. Maintenant, si vous ne voulez pas que l'article A, B & C contiennent des informations sur le pays, l'état, la ville, le long et lat comme vous pourriez avoir des milliers d'articles et qui prendrait beaucoup d'espace. Qu'est-ce que vous avez ici fonctionne pour obtenir les éléments, mais comment passez-vous l'emplacement de chaque élément au modèle? Comment obtenir/transmettre les objets d'emplacement pour chaque élément au modèle afin que je puisse imprimer la ville associée où l'élément est trouvé? – un33k

+0

J'ai raté le JOIN quelque part ... – un33k

+0

Utilisez '.select_related (" location ")' sur votre requête Item, puis accédez à {{item.location}} 'dans le template. C'est vraiment tout ce qu'il y a à faire ... – AdamKG

Questions connexes