Django - ForeignKey () использует другой столбец, чем идентификатор строки? - PullRequest
1 голос
/ 08 мая 2009

У меня есть приложение под названием Location. Местоположение имеет страну, штат, город, Big_City_Nearby, долготу, широту.

У меня есть заявка на предмет продажи. Элемент имеет название, ссылку, описание, цену и местоположение, которые являются ключом 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 извлекается и помещается в кортеж с объектом item. Но это было бы очень неэффективно SQL. Поскольку я должен был бы поразить базу данных для каждого найденного предмета, чтобы получить объект фактического местоположения.

Можно ли сказать, что ForeignKey удерживает город вместо идентификатора в строке местоположения в базе данных.

Чтобы упростить вопрос: есть ли лучший способ оставить местоположение как приложение, без необходимости указывать страну, штат, город ... и т. Д. в каждой строке товара.

Thx

VN44CA

1 Ответ

2 голосов
/ 08 мая 2009

Item.objects.filter(...).select_related("location"). Это присоединится к таблице местоположений, так что это будет только один запрос.

Еще лучше, Item.objects.filter(location__country=country, location__state=state).select_related("location"), и вы можете полностью пропустить запрос Location.

Честно говоря, у меня возникают проблемы с определением, если это все, что вам нужно, но это решает проблему O (N) запросов.

...