1

Locationというアプリケーションがあります。場所には、国、州、都市、Big_City_Nearby、経度、緯度があります。

販売アイテムの申し込みがあります。アイテムには、ForeignKey()であるタイトル、リンク、説明、価格、および場所があります。

これで、米国で販売されているすべての商品を表示したい場合は、リンク(http://example.com/United-States/など)をクリックすると、URLが「米国」で国として渡されます。 state、city、big_city_nearbyは空です。

#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})

見つかったアイテムごとの場所を表示しなくても、先に進んでオークランドのすべてのアイテムを一覧表示できるので、パス( http://example.com/United_State/California/Oakland )しても問題ありません。

問題は、http ://example.com/United_States/またはhttp://example.com/United_States/California/を選択した場合です。アイテムはさまざまな都市からのものである可能性があるため、各アイテムの場所を表示する必要があります。

したがって、テンプレートがアイテムのリストを取得するとき、各アイテムのForeignKey(Location)のみを取得します。別のループを配置できます。このループでは、各アイテムが調べられ、Locationオブジェクトがフェッチされ、アイテムオブジェクトとタプルに入れられます。しかし、それは非常に非効率的なSQLになります。実際のロケーションオブジェクトを取得するには、見つかった各アイテムのデータベースにアクセスする必要があるためです。

データベースのロケーション行のIDではなく、ForeignKeyが都市を保持していると言える方法はありますか?

質問を簡単にするために:国、州、都市などを提供する必要なしに、アプリケーションとして場所を除外するより良い方法はありますか?各アイテムの行に。

どうも、

VN44CA

4

1 に答える 1

2

Item.objects.filter(...).select_related("location"). これは location テーブルに対して JOIN するため、1 つのクエリだけになります。

さらに良いことに、クエリを完全にItem.objects.filter(location__country=country, location__state=state).select_related("location")省略できます。Location

正直なところ、これで十分かどうか判断するのに苦労していますが、これで O(N) クエリの問題を処理できます。

于 2009-05-08T19:04:49.967 に答える