Django —ForeignKey() は行 ID とは異なる列を使用しますか?
-
20-08-2019 - |
質問
Locationというアプリケーションがあります。場所には、国、州、都市、近隣市、経度、緯度があります。
出品商品の申し込みがありました。アイテムにはタイトル、リンク、説明、価格、場所があり、これはForeignKey()です。
ここで、米国で販売されているすべての商品を見たい場合は、リンクをクリックします (たとえば、 http://example.com/United-States/)、URL は国として「米国」を渡しますが、州、都市、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 の効率が非常に悪いでしょう。実際の位置オブジェクトを取得するには、見つかったアイテムごとにデータベースにアクセスする必要があるためです。
ForeignKey がデータベース内の場所行の ID の代わりに都市を保持していると言える方法はありますか。
質問を簡単にすると次のようになります。国、州、都市などを指定せずに、アプリケーションとして場所を除外するより良い方法はありますか。各項目行に。
THX、
VN44CA
解決
Item.objects.filter(...).select_related("location")
. 。これは location テーブルに対して JOIN するため、クエリは 1 つだけになります。
さらに良いことに、 Item.objects.filter(location__country=country, location__state=state).select_related("location")
を省略することもできます Location
完全にクエリします。
正直なところ、これで十分かどうか判断するのに苦労していますが、O(N) クエリの問題はこれで解決できます。