2009-05-08 4 views
1

У меня есть приложение под названием Location. Местоположение имеет страну, штат, город, Big_City_Nearby, долготу, широту.Django - ForeignKey() использует другой столбец, чем идентификатор строки?

У меня есть заявление о покупке предмета. Пункт имеет Название, Ссылка, Описание, Цена & Местоположение, которое является 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

ответ

2

Item.objects.filter(...).select_related("location"). Это будет ПРИСОЕДИНЯТЬСЯ к таблице местоположений, так что это будет только один запрос.

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

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

+0

Вы разрешаете людям продавать вещи на вашем сайте. Лицо A продает товар только в США/CA/Oakland, Person B продает только товар B в США/CA/*, а лицо C продает товар C в США/*. Теперь, если вы не хотите, чтобы элемент A, B & C содержал информацию о стране, штате, городе, длине и лате, поскольку у вас могут быть тысячи предметов, и это займет много места. Что вы здесь делаете, чтобы получить элементы, но как вы передаете местоположение каждого элемента в шаблон? Как я могу получить/передать объекты местоположения для каждого элемента в шаблон, чтобы я мог напечатать связанный город, в котором находится элемент? – un33k

+0

Я пропустил JOIN где-то ... – un33k

+0

Используйте '.select_related (" location ")' в вашем запросе 'Item', затем в' template {link}}. Это действительно все, что нужно ... – AdamKG